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
相关产品推荐
相关产品推荐

