MongoDB基于主外键关联mp与clib集合查询符合条件clibId的实现方法
MongoDB关联查询需求实现方案
方法1:使用$lookup关联查询
你之前使用$lookup失败的核心原因是 两个集合关联字段的类型不匹配:mp集合的clibId为字符串类型,clib集合的_id为ObjectId类型,直接关联无法命中数据,正确的聚合查询写法如下:
db.mp.aggregate([ // 转换clibId类型为ObjectId,和clib集合的_id类型对齐 { $addFields: { clibIdObj: { $toObjectId: "$clibId" } } }, // 关联clib集合 { $lookup: { from: "clib", localField: "clibIdObj", foreignField: "_id", as: "relatedClib" } }, // 展开关联返回的数组 { $unwind: "$relatedClib" }, // 筛选type=0的记录 { $match: { "relatedClib.type": 0 } }, // 可选:清理返回字段,只保留mp的原始数据 { $unset: ["clibIdObj", "relatedClib"] } ])
用你提供的示例数据运行以上查询,会返回clibId: "6178008397be0747443a2a91"的那条mp记录,符合需求。
方法2:字段冗余方案的合理性
将clib的type字段冗余到mp集合不属于MongoDB反模式,是否适用可以根据业务场景判断:
- 适合冗余的场景:
clib的type字段更新频率极低、甚至几乎不会变更,冗余后查询mp时不需要关联,性能提升明显,尤其是mp数据量较大时收益更高 - 不适合冗余的场景:
clib的type字段更新频繁,冗余会带来数据一致性维护成本,每次更新clib.type都要同步更新所有关联的mp文档,这种情况下优先选择$lookup关联方案
内容的提问来源于stack exchange,提问作者Rajan Shah
相关产品推荐
相关产品推荐

