单个MongoDB查询以汇总计数

时间:2018-08-28 23:59:40

标签: mongodb mongodb-query aggregation-framework pymongo

我有一个集合peopleColl,其中包含带有人员数据的记录。每个记录都由id唯一索引,并且具有数组类型的managers字段。

示例:

{
   id: 123,
   managers: [456, 789]
},
{
   id: 321,
   managers: [555, 789]
}

我想编写一个查询来查找具有同一管理者的所有人员,以获得多个ID(管理人员)。因此,给定[456、555、789],所需的输出将是:

{
    456: 1,
    555: 1,
    789: 2
}

我可以在Python中的for循环中(缓慢地)执行以下操作:

idToCount = {id: peopleColl.count({"managers": id}) for id in ids}

编辑:我主要对解决方案<= MongoDB 3.4

感兴趣

3 个答案:

答案 0 :(得分:2)

您可以在mongodb 3.4.4 及更高版本

中尝试以下聚合
db.collection.aggregate([
  { "$unwind": "$managers" },
  { "$group": { "_id": "$managers", "count": { "$sum": 1 }}},
  { "$group": {
    "_id": null,
    "data": {
      "$push": {
        "k": { "$toLower": "$_id" },
        "v": "$count"
      }
    }
  }},
  { "$replaceRoot": { "newRoot": { "$arrayToObject": "$data" }}}
])

输出

[
  {
    "456": 1,
    "555": 1,
    "789": 2
  }
]

答案 1 :(得分:1)

您可以在管道下面尝试。

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

输出:

{'_id': 456, 'count': 1},
{'_id': 555, 'count': 1},
{'_id': 789, 'count': 2}

因此您可以遍历并创建Id-Count映射

result = db.collection.aggregate([
      { "$unwind": "$managers" },
      { "$group": { "_id": "$managers", "count": { "$sum": 1 }}}
    ])

iD_Count = {}
result.forEach(function(d, i) {
iD_Count[d._id] = d.count;
})

iD_Count:

{
    456: 1,
    555: 1,
    789: 2
}

答案 2 :(得分:1)

您可以尝试在3.6中进行以下汇总。

db.colname.aggregate([
  {"$unwind":"$managers"},
  {"$group":{"_id":"$managers","count":{"$sum":1}}},
  {"$group":{
    "_id":null,
    "managerandcount":{"$mergeObjects":{"$arrayToObject":[[["$_id","$count"]]]}}
  }},
  {"$replaceRoot":{"newRoot":"$managerandcount"}}
])