Mongodb聚合查询在多个条目的数组内

时间:2014-07-22 08:32:19

标签: python mongodb mongodb-query aggregation-framework

我有一个看起来像这样的mongo DB - >

集合名称:用户

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

我希望有一个聚合查询,它查找db.users.acl.users的所有文档,并查找每个唯一objectID的计数。

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

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

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

],
"ok" : 1
}

我尝试过pythonic方式,首先添加所有数组,然后查找计数,但我希望通过查询更多地通过python进行更多。我非常无知如何查询这样的数组。

任何想法从哪里开始?

1 个答案:

答案 0 :(得分:3)

通常在聚合框架中使用MongoDB中的数组时,您希望使用$unwind管道运算符将内容“反规范化”为单独的文档。允许您在其他管道阶段使用它们:

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

Python语法通常与JavaScript的shell语法基本相同,因此通常应用SQL to Aggregation mapping等直接示例。