【问题标题】:Query embedded documents查询嵌入文档
【发布时间】:2012-08-22 16:20:39
【问题描述】:

我将创建一个这样的架构:

[
    {
        username: "fabio",
        password: "xxx",
        roles: [
            {
                rolename: "administrator",
                isVip: true
            },
            {
                rolename: "manager",
                isVip: true
            }
        ]
    },
    {
        username: "marco",
        password: "yyy",
        roles: [
            {
                rolename: "manager",
                isVip: true
            }
        ]
    },
    {
        username: "pippo",
        password: "...",
        roles: [
            {
                rolename: "monkey",
                isVip: false
            }
        ]
    }
]

现在我想列出我的应用中所有可用的角色,从用户集合开始。

我想到了一个SELECT DISTINCT rolename FROM ... SQL 语句。

我想得到类似{"administrator","manager","monkey"}的结果。

  1. 有可能吗?
  2. 我可以执行什么查询?我很纠结:

    db.users.find({ "roles.rolename": { $exists : true }});

    但这会找到所有用户,而不是所有角色。

  3. 效果好吗?还是创建另一个集合“角色”并保留一个 ObjectId 数组更好?

  4. 我正在使用 Mongoose(用于 nodejs 的 mongodb),因此我的查询必须为此做好准备。

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    您可以使用distinct() 命令查找唯一值:

    > db.users.distinct('roles.rolename')
    [ "administrator", "manager", "monkey" ]
    

    【讨论】:

    • 处理数十亿文档用户和角色是否高效? stackoverflow.com/questions/12139334/…
    • 如果您有 数十亿 个用户和角色,您会以不同的方式处理数据模型。充其量,distinct 将扫描作为查询条件提供的所有文档的索引 .. 如果索引适合内存,这可能很好。如果您没有索引,则 distinct 将不得不扫描匹配的文档)。这取决于您实际需要查找不同角色的频率,但您也可以限制查询(例如,按日期查找新角色)。另一种数据模型是将不同的角色名称保存在他们自己的集合中(可能以角色名称为键,或者在同一集合中使用唯一索引)。
    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2011-04-26
    • 2015-02-06
    相关资源
    最近更新 更多