如何根据条件推送一个字段?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据条件推送一个字段?相关的知识,希望对你有一定的参考价值。

我试图在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
}]

Test #1

如果我添加这个$ group阶段:

{ $group : { _id : "$actions", total: { $sum: 1} }}

我得到了我想要的计数,但它考虑了不需要的“等待”数组元素。

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

Test #2

{ $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
}]

UPDATE:

我的简化文档如下所示:

{
    "_id": ObjectID("573e0c6155e2a8f9362fb8ff"),
    "user": {
        "name": "Bob",
    },
    "action": "add",
}
答案

你需要在你的管道中有一个初步的$match阶段,只选择那些“行动”不等于“等待”的文件。

db.collection.aggregate([
    { "$match": { "action": { "$ne": "wait" } } },
    { "$group": { 
        "_id": "$user.name", 
       "actions": { "$push": "$action" }, 
       "total": { "$sum": 1 } 
    }}
])

以上是关于如何根据条件推送一个字段?的主要内容,如果未能解决你的问题,请参考以下文章

片段的条件自定义 OnBackPress

如何根据Kendo Grid Angular 4中的条件为一列分配2个字段

如何有条件地将 C 代码片段编译到我的 Perl 模块?

如何过滤复杂对象的列表,以便如果两个具有字段值,我会根据条件删除一个

如何根据某些条件使 Jboss 崩溃

如何在通知选项卡中单击推送通知消息打开特定片段?