我正试图汇总一批文件.我想推送的文档中有两个字段.但是,假设它们是"_id"和"A"字段,如果"A"是$gt 0,我只想要$push"_id"和"A".

我try 了两种方法.

第一个.

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?

ADDED:

预期文件:

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

推荐答案

这是我在阅读@Veeram建议的帖子后对这个问题的回答

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

Mongodb相关问答推荐

MongoDB聚合匹配字符串字符

更新值导致错误 Golang MongoDB

更快地识别嵌套对象数组中具有重复字段的文档

在 MongoDB 中,如何使用对当前值进行操作的函数来更新嵌套文档的值?

使用绝对类型在 Typescript 中编写 Mongoose 的类型化模型和模式的类和接口

无法使用机器 ip 连接到 mongodb

MongoDB 使用自定义表达式或函数进行排序

使用 Spring Boot >= 2.0.1.RELEASE 将 ZonedDateTime 保存到 MongoDB 时出现 CodecConfigurationException

GeoJSON 和 MongoDB:将点存储为 GeoJSON.Point 是否值得?

在 MongoDb 中查询小于 NOW 的日期时间值

请按语法排序 Mongoid Scope

MongoDB 嵌套 OR/AND 在哪里?

Ruby 按键值分组哈希

具有 AWS 云形成和自动zoom 的 Mongodb 集群

在 mongodb 中的索引列上查找重复项的快速方法

MongoDB服务器仍然可以在没有凭据的情况下访问

填充mongoose后查找

如何匹配 MongoDB 聚合框架中的 undefined值?

如何在mongoose的嵌套填充中 Select 特定字段

带有索引字段的 MongoDB 正则表达式