单个MongoDB查询到聚合计数

单个MongoDB查询到聚合计数,mongodb,mongodb-query,aggregation-framework,pymongo,Mongodb,Mongodb Query,Aggregation Framework,Pymongo,我有一个集合peopleColl,其中包含包含人员数据的记录。每个记录都由id唯一索引,并有一个数组类型的managers字段 例如: { id: 123, managers: [456, 789] }, { id: 321, managers: [555, 789] } 我想编写一个查询,查找具有相同管理者的所有人员,查找多个ID(管理者)。因此,给定[45655789],期望输出为: { 456: 1, 555: 1, 789: 2 } 我

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

例如:

{
   id: 123,
   managers: [456, 789]
},
{
   id: 321,
   managers: [555, 789]
}
我想编写一个查询,查找具有相同管理者的所有人员,查找多个ID(管理者)。因此,给定[45655789],期望输出为:

{
    456: 1,
    555: 1,
    789: 2
}
我可以在Python中的for循环中(缓慢地)执行此操作,如下所示:

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

编辑:我主要对解决方案感兴趣,您可以在mongodb3.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
  }
]

你可以试试下面的管道

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

{'_id': 456, 'count': 1},
{'_id': 555, 'count': 1},
{'_id': 789, 'count': 2}
因此,您可以循环并创建Id计数映射

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;
})
身份证号码:

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

您可以在3.6中尝试下面的聚合

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

注意。ID从int改为string,然而,这是一个快速可行的解决方案