You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MongoDB聚合管道中组合值匹配与多条件筛选?

解决MongoDB聚合管道筛选数组元素的问题

嘿,我来帮你搞定这个数组筛选的需求!你之前尝试用$cond没成功是因为用错了操作符——$cond是用来做条件分支返回值的,而我们需要对数组里的元素进行筛选过滤,正确的工具应该是$filter操作符。

下面是能实现你需求的聚合管道代码:

db.yourCollectionName.aggregate([
  {
    $addFields: { // 用$addFields保留原有字段,只更新row数组;如果要替换所有字段可以用$project
      row: {
        $filter: {
          input: "$row", // 要筛选的原数组
          as: "item",    // 遍历数组时每个元素的别名
          cond: {        // 筛选条件:满足任一即可
            $or: [
              // 条件1:identifier等于"a"
              { $eq: ["$$item.identifier", "a"] },
              // 条件2:identifier等于"c" 并且 value大于5
              {
                $and: [
                  { $eq: ["$$item.identifier", "c"] },
                  { $gt: ["$$item.value", 5] }
                ]
              }
            ]
          }
        }
      }
    }
  }
])

代码解释:

  • $filter专门用于在聚合管道中筛选数组元素,它会遍历input指定的数组,只保留满足cond条件的元素。
  • 我们用$or组合两个筛选规则:要么元素的identifier是"a",要么是"c"且value大于5(这里用$and把两个子条件绑定在一起)。
  • 用$addFields而不是$project的好处是,它会保留文档中其他所有字段(比如你的_id字段),只更新row数组的内容,完全符合你期望的结果结构。

用这个管道处理你给出的示例文档后,得到的结果就是:

[
  {
    "_id": 1,
    "row": [
      { "identifier": "a", "value": 52 },
      { "identifier": "c", "value": 36 }
    ]
  }
]

内容的提问来源于stack exchange,提问作者Julian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:30:27