查询嵌入文档

问题描述:

我要创建一个模式是这样的:查询嵌入文档

[ 
    { 
     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. 它好吗?或者更好地创建另一个集合“角色”并保留一组ObjectIds?

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

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

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

其高效与数十亿的文件用户和角色的? http://*.com/questions/12139334/how-to-query-all-subdocuments –

+0

如果你有*数十亿的用户和角色,你会以不同的方式处理你的数据模型。最好的情况是,distinct将扫描作为查询标准提供的所有文档的索引。如果索引适合内存,这可能很好。如果你没有索引,不同的将不得不扫描匹配的文件)。这取决于您实际需要多长时间才能找到不同的角色,但您也可以限制查询(例如,按日期查找新角色)。另一种数据模型是将不同的角色名称保存在他们自己的集合中(可能由角色名称或同一个唯一索引键入)。 – Stennie