2014-07-22 37 views
0

我有一个蒙戈DB看起来像这样的数组内的MongoDB聚集查询 - >在多个条目

集合名称:用户

{ username:'something' 
    _id : ObjectId(someID1) 
    acl : { users : [ObjectId(someID1),ObjectId(someID2),ObjectId(someID3)] , group : [grpID4,grpID5,grpID6] } 
    . 
    . 
    . 
} 

我想有一个聚集查询,看起来在所有用于db.users.acl.users的文档并查找每个唯一对象ID的计数。

它像添加users.acl.users的所有数组,然后返回每个唯一ID的计数在一个python字典

{ 
"result" : [ 
     { 
       "_id" : ObjectId("someID1"), 
       "count" : 20     

     }, 
     { 
       "_id" : ObjectId("someID2"), 
       "count" : 2 
     }, 
     { 
       "_id" : ObjectID("someID3") 
       "count" : 1 
     }, 

], 
"ok" : 1 
} 

我曾尝试Python的方式,即首先将所有阵列和然后找到计数,但我想通过查询来做更多的事情,而与python相比更多。我很笨,如何在这样的数组内查询。

任何想法从哪里开始?

回答

3

通常,当您在聚合框架中使用MongoDB中的数组时,您希望使用管道运算符$unwind将内容“解除规范化”为单独的文档。将让你与他们在其他流水线阶段工作:

db.users.aggregate([ 
    { "$unwind": "$acl.users" }, 
    { "$group": { 
     "_id": "$acl.users", 
     "count": { "$sum": 1 } 
    }} 
]) 

Python语法通常是基本相同的JavaScript shell语法,所以直接的例子,如SQL to Aggregation mapping一般应适用。