MongoDB如何按指定关联值连接testA与testB集合实现类SQL联表查询
$lookup 聚合实现(MongoDB 3.2+ 版本,逻辑与SQL JOIN完全对齐)
对应你需求的查询逻辑,是先筛选testB中指定_id的文档,再通过外键关联匹配对应的testA记录,标准聚合写法如下:
db.testB.aggregate([ // 精准匹配目标testB文档,触发_id主键索引扫描,避免全表遍历 { $match: { _id: ObjectId("605090a452a2ab598a013bbd") } }, // 关联testA集合:匹配规则为 testB的aId字段 == testA的_id字段 { $lookup: { from: "testA", localField: "aId", foreignField: "_id", as: "linkedA" } }, // 将嵌套在结果里的关联文档展平,只返回匹配到的testA内容 { $replaceRoot: { newRoot: { $arrayElemAt: ["$linkedA", 0] } } } ])
执行该语句的返回结果:
{ "_id" : ObjectId("60508eeb52a2ab598a013bb9") }
完全匹配你预期的SQL查询输出。
低版本兼容实现(MongoDB 3.2 及更早版本无$lookup时使用)
如果版本不支持聚合关联能力,可以拆分两步查询,性能更优:
- 第一步:通过_id索引从testB中查出目标文档,提取关联用的aId值
const targetB = db.testB.findOne({ _id: ObjectId("605090a452a2ab598a013bbd") }) // 提取得到的aId为 ObjectId("60508eeb52a2ab598a013bb9")
- 第二步:拿着提取到的aId,直接查询testA集合的对应文档
db.testA.findOne({ _id: targetB.aId })
小提示:因为整个查询是基于_id主键做精准匹配,两种写法都会命中集合主键索引,不会出现全表扫描的性能损耗。
内容的提问来源于stack exchange,提问作者mobiusinversion
相关产品推荐
相关产品推荐

