Mongodb 用 $cond 和 $each 聚合 $push

Posted

技术标签:

【中文标题】Mongodb 用 $cond 和 $each 聚合 $push【英文标题】:Mongodb aggregate $push with $cond and $each 【发布时间】:2016-05-30 04:07:42 【问题描述】:

我试图在聚合$group 期间使用$cond 有条件地将$push 多个整数放到数字数组中,但没有任何成功。这是我的代码:

Item.aggregate(
    [
      
        $group: 
          _id: "$_id",
          numbers: 
            $push: 
              $cond:  
                if:  $gt: [ "$price.percent", 70 ] , 
                then:  $each: [10,25,50,70] ,
                else: null,
              
            
          
        
      ,
    ]
  )
  ...

Mongo DB 是不是现在没有为此设置,还是我看错了?

【问题讨论】:

【参考方案1】:

请尝试不使用$each,如下所示

Item.aggregate(
    [
        $group: 
          _id: "$_id",
          numbers: 
            $push: 
              $cond:  
                if:  $gt: [ "$price.percent", 70 ] , 
                then: [10,25,50,70] ,
                else: null,
              
            
          
        
      ]);

【讨论】:

嗨@zangw,感谢您的回复!这就是我最终要做的事情,但后来我不得不做两次 $unwind 来解开我的数组数组。这是有条件地将多个项目推送到数组的唯一方法吗? 是的,这就是我害怕的。哦,那也行。谢谢!我会把你标记为正确的【参考方案2】:

提供的答案将起作用,但只要执行else 块,它们就会将null 添加到数组中,最后您需要从实际数组(numbers)中过滤掉null 值,即一个额外的步骤!

您可以使用 $$REMOVE 有条件地排除 MongoDB 的 $project 中的字段。

Item.aggregate(
    [
        $group: 
            _id: "$_id",
            numbers:  $push:  $cond: [ $gt: ["$price.percent", 70] , [10, 25, 50, 70], '$$REMOVE']   // With $$REMOVE nothing happens on else
        
    ]);

参考: $cond

【讨论】:

【参考方案3】:

你试过了吗:

Item.aggregate(
    [
      
        $group: 
          _id: "$_id",
          numbers: 
            $push: 
              $each:  
                $cond:  
                  if:  $gt: [ "$price.percent", 70 ] , 
                  then: [10,25,50,70],
                  else: null
                
              
            
          
        
      ,
    ]
  )

【讨论】:

以上是关于Mongodb 用 $cond 和 $each 聚合 $push的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 $eq 和 $cond 替换 mongodb 中的字符串

MongoDB,如何将查找和排序与聚合中的 $cond 结合起来?

MongoDB,如何将查找和排序与聚合中的 $cond 结合起来?

带有 $cond 的 MongoDB 聚合管道 $addFields - 无法使用变量

$push 和 $set 在同一个更新查询中,条件为 $cond pymongo mongodb

在 Mongodb/Mongoose 聚合中的子集中应用 $cond