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

