我有一个集合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
感兴趣答案 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"}}
])