求助:MongoDB聚合Facet子管道添加特定条件过滤
解决方案
要实现你需要的两个过滤条件,可以在现有聚合管道的$project阶段之后添加以下几个阶段,逐步筛选出符合要求的记录:
修改后的完整聚合代码
db.collection.aggregate([ { $facet: { "data": [ { $match: { type: { $in: ["a1", "a2"] } } }, { $group: { _id: { emp_name: "$emp_name", type: "$type" }, count: { $sum: 1 } } }, { $project: { empName: "$_id.emp_name", type: "$_id.type", count: 1, _id: 0 } }, // 新增阶段开始 { $group: { _id: "$empName", records: { $push: "$$ROOT" }, types: { $addToSet: "$type" } } }, { $match: { types: { $all: ["a1", "a2"] } } }, { $unwind: "$records" }, { $match: { "records.type": "a2" } }, { $replaceRoot: { newRoot: "$records" } } // 新增阶段结束 ] } } ])
新增阶段说明
$group(按empName分组):把同一员工的所有记录聚合到一起,同时用$addToSet收集该员工出现过的所有type类型。$match(筛选多类型员工):通过$all条件,只保留同时包含a1和a2类型的员工分组。$unwind:展开每个员工的记录数组,回到单条记录的结构。$match(筛选a2类型):只保留type为a2的记录。$replaceRoot:将筛选后的记录恢复为顶层文档结构,保持输出格式和之前一致。
内容的提问来源于stack exchange,提问作者Prakash
相关产品推荐
相关产品推荐

