在MongoDB中使用聚合框架分组并计数
问题描述:
我正尝试使用计数将分组内的数据分组。在MongoDB中使用聚合框架分组并计数
{
"_id" : ObjectId("59899846b5f5670840040b0b"),
"client_id" : "merlin",
"scope" : "eee",
"user_id" : "u",
"user_directory" : "kmdkcn",
"createdAt" : ISODate("2017-08-08T10:53:58.816Z"),
"open_url" : null,
"__v" : 0
}
{
"_id" : ObjectId("59899849b5f5670840040b0c"),
"client_id" : "merlin",
"scope" : "eee",
"user_id" : "u",
"user_directory" : "kmdkcn",
"createdAt" : ISODate("2017-08-08T10:54:01.908Z"),
"open_url" : null,
"__v" : 0
}
{
"_id" : ObjectId("5989984db5f5670840040b0d"),
"client_id" : "merlin",
"scope" : "eee",
"user_id" : "y",
"user_directory" : "kmdkcn",
"createdAt" : ISODate("2017-08-08T10:54:05.280Z"),
"open_url" : null,
"__v" : 0
}
{
"_id" : ObjectId("5989adb2d699bd211caa07ad"),
"client_id" : "symphony",
"scope" : "eee",
"user_id" : "q",
"user_directory" : "kmdkcn",
"createdAt" : ISODate("2017-08-08T12:25:22.518Z"),
"open_url" : null,
"__v" : 0
}
{
"_id" : ObjectId("5989adb8d699bd211caa07ae"),
"client_id" : "symphony",
"scope" : "eee",
"user_id" : "w",
"user_directory" : "kmdkcn",
"createdAt" : ISODate("2017-08-08T12:25:28.954Z"),
"open_url" : null,
"__v" : 0
}
{
"_id" : ObjectId("5989adbcd699bd211caa07af"),
"client_id" : "symphony",
"scope" : "eee",
"user_id" : "q",
"user_directory" : "kmdkcn",
"createdAt" : ISODate("2017-08-08T12:25:32.753Z"),
"open_url" : null,
"__v" : 0
}
{
"_id" : ObjectId("5989adc0d699bd211caa07b0"),
"client_id" : "symphony",
"scope" : "eee",
"user_id" : "r",
"user_directory" : "kmdkcn",
"createdAt" : ISODate("2017-08-08T12:25:36.176Z"),
"open_url" : null,
"__v" : 0
}
我想要的是在client_id的基础上进一步分组数据,并进一步根据user_id来获取文档的计数。
我曾经尝试这样做: -
Logger.aggregate([
{ "$group": {
"_id": {client: "$client_id"},
"count": { "$sum": 1 }
}}
])
我得到: - 客户:梅林 数:3, 客户端:交响乐, 数:4
但如何分组这个上user_id的基础。
我想最后的结果将是: -
客户端:梅林, 数:2, 客户端:交响乐, 数:3
答
这是查询结果。
db.collection.aggregate([
{ "$group": {
"_id": {client: "$client_id" },
"clientIdCount": { "$sum": 1 },
"userids" : {"$addToSet" : "$user_id"}
}
},
{ "$project" : {"_id.client" : 1, "clientIdCount" : 1, numberOfUsers : {$size : "$userids"} }
}
]);
输出: -
如果你不想在输出clientIdCount
,距离1的值更改为0目前旁边clientIdCount
。
/* 1 */
{
"_id" : {
"client" : "symphony"
},
"clientIdCount" : 4,
"numberOfUsers" : 3
}
/* 2 */
{
"_id" : {
"client" : "merlin"
},
"clientIdCount" : 3,
"numberOfUsers" : 2
}
+0
非常感谢Notionquest。 –
+0
如果有帮助,请接受答案。 – notionquest
答
如果我明白你的问题正确这是你的数据库查询
db.Logger.aggregate([
{
$group : {
_id : "$client_id", user : { $push: "$user_id" },
count: { $sum: 1 }
}
}
])
您的意思是*“每个用户的每个客户端”?* –