Mongodb 如何根据条件推送字段?

Mongodb 如何根据条件推送字段?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,在MongoDB聚合管道的$group阶段,我试图有条件地将字段推送到数组中 基本上,我有带有用户名的文档,以及它们执行的一系列操作 如果我将用户操作分组如下: { $group: { _id: { "name": "$user.name" }, "actions": { $push: $action"} } } { "_id": ObjectID("573e0c6155e2a8f936

在MongoDB聚合管道的$group阶段,我试图有条件地将字段推送到数组中

基本上,我有带有用户名的文档,以及它们执行的一系列操作

如果我将用户操作分组如下:

{ $group: { _id: { "name": "$user.name" }, "actions": { $push: $action"} } }
{
    "_id": ObjectID("573e0c6155e2a8f9362fb8ff"),
    "user": {
        "name": "Bob",
    },
    "action": "add",
}
我得到以下信息:

[{
    "_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
}]

测试#1 如果我添加此$group阶段:

{ $group : { _id : "$actions", total: { $sum: 1} }}
我得到了想要的计数,但它考虑了不需要的“wait”数组元素

[{
    "_id": ["add"],
    "total": 1
}, {
    "_id": ["add", "subtract"],
    "total": 1
}, {
    "_id": ["add", "wait", "subtract"],
    "total": 1
}] 
测试#2 这是我得到的最接近的结果,但这会将空值推到等待的位置,我不知道如何删除它们

[{
    "_id": ["add"],
    "total": 1
}, {
    "_id": ["add", "subtract"],
    "total": 1
}, {
    "_id": ["add", null, "subtract"],
    "total": 1
}]

更新: 我的简化文档如下所示:

{ $group: { _id: { "name": "$user.name" }, "actions": { $push: $action"} } }
{
    "_id": ObjectID("573e0c6155e2a8f9362fb8ff"),
    "user": {
        "name": "Bob",
    },
    "action": "add",
}
您需要在管道中进行一个初步阶段,以便仅选择“action”不等于“wait”的文档


你能显示你的原始文档吗?@user3100115我已经更新了问题,所以你不想在数组中出现“等待”。对吗?@user3100115没错。我希望能够删除作为操作等待的文档,并且只考虑其余的文档。在管道中的$group阶段有什么方法可以做到这一点,还是只有使用$match才能做到这一点?