MongoDB中如何基于另一个集合的字段查询匹配记录
MongoDB 关联查询实现方案
你描述的MySQL inner join关联逻辑,在MongoDB 3.2及以上版本可以通过聚合管道的$lookup操作符实现,具体实现代码和说明如下:
实现代码
db.A.aggregate([ // 优先过滤主集合数据,减少后续计算量,对应SQL where id=12 { $match: { id: 12 } }, // 集合关联逻辑,对应SQL inner join b on a.id = b.id { $lookup: { from: "B", // 关联的目标集合名称 localField: "id", // 主集合A的关联字段 foreignField: "id", // 被关联集合B的关联字段 as: "matched_b_data" // 匹配到的B集合数据会存入该数组字段 } }, // 过滤关联无结果的文档,实现*inner join*效果($lookup默认是左外连接,不加这一步会返回A集合匹配到但B无关联的文档) { $match: { matched_b_data: { $ne: [] } } }, // 可选步骤:如果需要和SQL select *一样将B集合字段平铺到外层,添加以下3个阶段 { $unwind: "$matched_b_data" }, { $replaceRoot: { newRoot: { $mergeObjects: ["$$ROOT", "$matched_b_data"] } } }, { $unset: "matched_b_data" } ])
注意事项
- 确保两个集合的关联字段类型完全一致,比如如果id是ObjectId类型,不要用数字类型值查询,否则会匹配失败
- 建议提前给A、B集合的关联字段创建索引,且将$match阶段放在聚合最前,可大幅提升查询效率
- 如果不需要平铺B集合字段,直接删除最后三个可选阶段即可,返回结果会保留A集合原有结构,匹配到的B数据统一存在
matched_b_data数组中
内容的提问来源于stack exchange,提问作者Niyojita
相关产品推荐
相关产品推荐

