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

如何用MongoDB聚合查询获取含真假布尔值的同ID记录

MongoDB聚合查询:筛选condition同时包含true和false的id记录

需求说明

从给定文档中,筛选出同一id下的condition字段同时存在true和false两种值的记录(比如示例中的id=1),排除仅有一种condition值的id(比如id=2)。

聚合查询语句

方式1:仅返回符合条件的id

db.collection.aggregate([
  // 按id分组,收集该id下所有去重后的condition值
  {
    $group: {
      _id: "$id",
      conditions: { $addToSet: "$condition" }
    }
  },
  // 筛选出同时包含true和false的分组
  {
    $match: {
      $expr: {
        $and: [
          { $in: [true, "$conditions"] },
          { $in: [false, "$conditions"] }
        ]
      }
    }
  },
  // 调整输出格式,只显示id字段
  {
    $project: {
      _id: 0,
      id: "$_id"
    }
  }
])

方式2:返回原文档中所有符合条件的记录

如果需要获取完整的原文档数据,可在上述基础上增加关联逻辑:

db.collection.aggregate([
  {
    $group: {
      _id: "$id",
      conditions: { $addToSet: "$condition" }
    }
  },
  {
    $match: {
      $expr: {
        $and: [
          { $in: [true, "$conditions"] },
          { $in: [false, "$conditions"] }
        ]
      }
    }
  },
  // 关联原集合,获取该id下的所有原始文档
  {
    $lookup: {
      from: "collection", // 替换为你的实际集合名称
      localField: "_id",
      foreignField: "id",
      as: "matched_docs"
    }
  },
  // 展开嵌套的文档数组
  { $unwind: "$matched_docs" },
  // 将原文档设为输出根节点
  {
    $replaceRoot: { newRoot: "$matched_docs" }
  }
])

关键步骤解释

  • $group阶段:按id聚合,用$addToSet收集去重后的condition值,避免重复值干扰后续判断。
  • $match阶段:通过$expr使用聚合表达式,精准判断conditions数组是否同时包含true和false,筛选出目标id。
  • $lookup + $unwind + $replaceRoot:将筛选出的id关联回原集合,还原并输出完整的原始文档数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:52:06