首页 > 解决方案 > $sum 字符串值与数组 MongoDB 中的 $cond

问题描述

我正在尝试$sum一些符合下一个条件的值。

我的收藏:

{
    _id: 1,
    items: [ 
    {
        name: 'item1',
        status: 'On'
    },
    {
        name: 'item2',
        status: 'On'
    },
    {
        name: 'item3',
        status: 'Off'
    }]
}

我需要$sum所有items状态为“开启”的人

这就是我正在尝试的:

     {
        $addFields: {
            itemsOn: { "$sum": { "$cond": [{ if: { $eq: ["$items.status", 'On'] } }, { then: 1 }, { else: 0 }] } },
        }
    }

但它不起作用,有什么帮助吗?提前致谢

标签: mongodb

解决方案


  • $filter根据条件过滤项目,$size从过滤器中获取返回元素的总数,
db.collection.aggregate([
  {
    $addFields: {
      itemOn: {
        $size: {
          $filter: {
            input: "$items",
            cond: { $eq: ["$$this.status", "On"] }
          }
        }
      }
    }
  }
])

操场


第二个选项使用$reduce,

  • $reduce迭代数组循环items,检查条件是否匹配,然后与值相加
db.collection.aggregate([
  {
    $addFields: {
      itemOn: {
        $reduce: {
          input: "$items",
          initialValue: 0,
          in: {
            $cond: [
              { $eq: ["$$this.status", "On"] },
              { $sum: ["$$value", 1] },
              "$$value"
            ]
          }
        }
      }
    }
  }
])

操场


推荐阅读