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

MongoDB聚合:在$project管道中筛选数组内flag为true的元素

MongoDB聚合筛选数组并投影指定字段方案

你可以在现有聚合逻辑后添加$project管道,结合$filter和$arrayElemAt操作符实现需求,完整代码如下:

let data = await Books.aggregate([
  {
    $group: {
      _id: "$genre", // 修正原代码字段引用的语法问题
      price: { $sum: "$price" },
      data: {
        $addToSet: {
          subGenre: "$subGenre",
          flag: "$flagSelectGenre"
        }
      }
    }
  },
  {
    $project: {
      _id: 0, // 隐藏默认_id字段
      price: 1, // 保留price字段
      subGenre: {
        $arrayElemAt: [
          {
            $map: {
              input: {
                $filter: {
                  input: "$data",
                  cond: { $eq: ["$$this.flag", true] }
                }
              },
              as: "item",
              in: "$$item.subGenre"
            }
          },
          0 // 因flag为true的元素唯一,直接取数组第一个元素
        ]
      }
    }
  }
]);

代码逻辑说明:

  • $filter:遍历data数组,筛选出flag为true的元素,得到仅含目标对象的数组。
  • $map:将筛选后的对象数组转换为仅包含subGenre字符串的数组。
  • $arrayElemAt:利用目标元素唯一的特性,直接取数组第一个元素作为最终subGenre值。
  • 投影配置:通过_id: 0隐藏默认_id,price: 1保留价格字段,最终只输出需求的两个字段。

简化写法(利用$first):

如果确认筛选后数组仅含一个元素,也可以用$first替代$arrayElemAt,代码更简洁:

{
  $project: {
    _id: 0,
    price: 1,
    subGenre: {
      $first: {
        $map: {
          input: { $filter: { input: "$data", cond: { $eq: ["$$this.flag", true] } } },
          as: "item",
          in: "$$item.subGenre"
        }
      }
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:25:54