MongoDB查询A集合中_id存在于B集合的原始文档(无多余join字段)
解决方案
你可以在原有聚合语句基础上增加$match过滤和字段剔除步骤,最终可用代码如下:
db.getCollection('A').aggregate([ { $lookup: { from: "B", localField: "_id", foreignField: "_id", as: "bid", } }, // 过滤出B集合中存在对应_id的A文档 { $match: { bid: { $ne: [] } } }, // 移除临时关联字段,返回A集合原始结构 { $project: { bid: 0 } } ])
逻辑说明
- 原有
$lookup阶段完成A、B集合的_id关联后,没有匹配项的文档bid字段会是空数组,我们正是通过这个特征做筛选 - 如果你使用的是MongoDB 4.2及以上版本,也可以把最后一步的
$project替换为更简洁的$unset: "bid",效果完全一致 - 如果是MongoDB 5.0以上版本,还可以在
$lookup的pipeline中加$limit: 1,减少不必要的查询性能消耗:
db.getCollection('A').aggregate([ { $lookup: { from: "B", localField: "_id", foreignField: "_id", as: "bid", pipeline: [ { $limit: 1 } ] } }, { $match: { bid: { $ne: [] } } }, { $unset: "bid" } ])
内容的提问来源于stack exchange,提问作者DenisNovac
相关产品推荐
相关产品推荐

