单个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,然而,这是一个快速可行的解决方案