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

求助: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:03:27