我正试图在MongoDB聚合管道的$ group阶段有条件地将字段推入数组。
基本上我有包含用户名称的文档,以及他们执行的操作数组。
如果我将用户操作分组如下:
{ $group: { _id: { "name": "$user.name" }, "actions": { $push: $action"} } }
我得到以下内容:
[{
"_id": {
"name": "Bob"
},
"actions": ["add", "wait", "subtract"]
}, {
"_id": {
"name": "Susan"
},
"actions": ["add"]
}, {
"_id": {
"name": "Susan"
},
"actions": ["add, subtract"]
}]
到目前为止一切顺利。我们的想法是现在将actions数组合在一起,以查看哪些用户操作最受欢迎。问题是我需要在考虑组之前删除“等待”操作。因此,结果应该是这样的,考虑到在分组中不应该考虑“wait”元素:
[{
"_id": ["add"],
"total": 1
}, {
"_id": ["add", "subtract"],
"total": 2
}]
如果我添加这个$ group阶段:
{ $group : { _id : "$actions", total: { $sum: 1} }}
我得到了我想要的计数,但它考虑了不需要的“等待”数组元素。
[{
"_id": ["add"],
"total": 1
}, {
"_id": ["add", "subtract"],
"total": 1
}, {
"_id": ["add", "wait", "subtract"],
"total": 1
}]
{ $group: { _id: { "name": "$user.name" }, "actions": { $push: { $cond: { if:
{ $ne: [ "$action", 'wait']}, then: "$action", else: null } }}} }
{ $group : { _id : "$actions", total: { $sum: 1} }}
这就像我得到的那样接近,但这会推动等待的空值,而我无法弄清楚如何删除它们。
[{
"_id": ["add"],
"total": 1
}, {
"_id": ["add", "subtract"],
"total": 1
}, {
"_id": ["add", null, "subtract"],
"total": 1
}]
我的简化文档如下所示:
{
"_id": ObjectID("573e0c6155e2a8f9362fb8ff"),
"user": {
"name": "Bob",
},
"action": "add",
}
答案 0 :(得分:5)
您的管道中需要一个初步$match
阶段,只选择那些“行动”不等于“等待”的文件。
db.collection.aggregate([
{ "$match": { "action": { "$ne": "wait" } } },
{ "$group": {
"_id": "$user.name",
"actions": { "$push": "$action" },
"total": { "$sum": 1 }
}}
])