Mongodb - 聚合 $push 如果有条件

Posted

技术标签:

【中文标题】Mongodb - 聚合 $push 如果有条件【英文标题】:Mongodb - aggregation $push if conditional 【发布时间】:2018-09-16 03:23:30 【问题描述】:

我正在尝试聚合一批文档。我想 $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"
])

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

第二个。

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"]

【问题讨论】:

我认为你的方法行不通docs.mongodb.com/manual/reference/operator/aggregation/push > $push 仅在 $group 阶段可用。 @libik 我更正了我的问题。 【参考方案1】:

你可以使用"$$REMOVE":

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

这样你就不必过滤空值了。

【讨论】:

$$REMOVE 是系统变量,不是运算符【参考方案2】:

这是我在阅读@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"
    
])

【讨论】:

这里的setDifference有错别字。 您好,在谷歌搜索时发现了这个,您如何将 setDifference 参数转换为 mgo 库?哪种类型?【参考方案3】:

另一种选择是使用 $filter 运算符:

db.collection.aggregate([
 
    $group : 
        _id: null,
        field:  $push:  id: "$_id", A : "$A",
        secondField: $push: "$B" 
    
,

    $project: 
        field: 
            $filter: 
                input: "$field",
                as: "item",
                cond:  $gt: [ "$$item.A", 0 ] 
            
        ,
        secondField: "$secondField"
           
])

第一步,你合并你的数组并在第二步过滤它们

【讨论】:

以上是关于Mongodb - 聚合 $push 如果有条件的主要内容,如果未能解决你的问题,请参考以下文章

如何仅在特定条件下执行 MongoDB 聚合阶段之一?

$element 匹配或 $unwind 与 AND/Multiple 条件与 mongoDB 聚合

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

$match mongodb聚合框架_mongoose中的多条件[重复]

$match mongodb聚合框架_mongoose中的多条件[重复]

使用push和group在mongodb中聚合