如何使用MongoDB聚合匹配仅存在于集合A而非集合B的文档
如何用MongoDB聚合操作筛选仅存在于集合A但不存在于集合B的文档
要实现这个需求,你可以通过MongoDB聚合框架的$lookup、$match和$project阶段组合完成,具体操作如下:
完整聚合代码
db.collectionA.aggregate([ // 关联集合B,匹配_id相同的文档 { $lookup: { from: "collectionB", localField: "_id", foreignField: "_id", as: "matchedDocs" } }, // 筛选出集合B中无匹配的文档 { $match: { matchedDocs: { $size: 0 } } }, // 移除临时生成的matchedDocs字段 { $project: { matchedDocs: 0 } } ])
各阶段说明
- $lookup:将集合A的每个文档与集合B中
_id字段相同的文档进行关联,关联结果会存入新增的matchedDocs数组。如果集合B中没有匹配的文档,这个数组会是空的。 - $match:通过
$size: 0筛选出matchedDocs为空的文档,这些就是仅存在于集合A、不存在于集合B的目标文档。 - $project:移除聚合过程中生成的
matchedDocs字段,让输出文档结构和原集合A的文档一致。
示例验证
用你提供的集合数据运行上述聚合操作后,会得到预期结果:
[ { "_id": 3, "operation": "SEC", "name": "z" } ]
扩展说明
如果你的匹配条件不是_id(比如用name字段匹配),只需修改$lookup中的localField和foreignField为对应的字段名即可,适配不同的业务场景。
内容的提问来源于stack exchange,提问作者dipta kumar
相关产品推荐
相关产品推荐

