Mongodb - 如果有条件则聚合$push

标签 mongodb mongodb-query aggregation-framework mgo

我正在尝试聚合一批文档。我想要 $push 的文档中有两个字段。但是,假设它们是“_id”和“A”字段,如果“A”是 $gt 0,我只需要 $push“_id”和“A”。

我尝试了两种方法。

第一个。

db.collection.aggregate([{
"$group":{
    "field": {
        "$push": {
            "$cond":[
                {"$gt":["$A", 0]},
                {"id": "$_id", "A":"$A"},
                null
            ]
        }
    },
    "secondField":{"$push":"$B"}
}])

但这会将空值推送到“field”,而我不想要它。

第二个。

db.collection.aggregate([{
"$group":
    "field": {
        "$cond":[
            {"$gt",["$A", 0]},
            {"$push": {"id":"$_id", "A":"$A"}},
            null
        ]
    },
    "secondField":{"$push":"$B"}
}])

第二个根本不起作用......

在其他情况下有没有办法跳过 $push?

添加:

预期文件:

{
    "_id":objectid(1),
    "A":2,
    "B":"One"
},
{
    "_id":objectid(2),
    "A":3,
    "B":"Two"
},
{
    "_id":objectid(3),
    "B":"Three"
}

预期输出:

{
    "field":[
        {
            "A":"2",
            "_id":objectid(1)
        },
        {
            "A":"3",
            "_id":objectid(2)
        },
    ],
    "secondField":["One", "Two", "Three"]
}

最佳答案

您可以使用“$$REMOVE”:

  • 此系统变量是在版本 3.6 中添加的 ( mongodb docs )
db.collection.aggregate([{
   $group:{
       field: {
          $push: {
              $cond:[
                { $gt: ["$A", 0] },
                { id: "$_id", A:"$A" },
                "$$REMOVE"
            ]
          }
        },
        secondField:{ $push: "$B" }
    }
])

这样您就不必过滤空值。

关于Mongodb - 如果有条件则聚合$push,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49687020/

相关文章:

java - Spring data DBRef 延迟加载 REST - 500 服务器错误

mysql - 具有大量条目的可轻松过滤的数据库表

node.js - 如何在 MongoDB 的数组中提取项目的一个实例?

python - 更新文档 - 按日期过滤的先前文档的平均值

mongodb - 如何使用多个 $cond 对查询进行分组?

node.js - Mongoose 未正确插入 MongoDB

mongodb - Mongoose 更新: obtaining pushed subdocument's _id

mongodb - $indexOfArray 将数组元素字段与值匹配

javascript - 如何在mongodb中查询数组

MongoDB - 使用聚合框架或 mapreduce 匹配文档中的字符串数组(配置文件匹配)