Lookup无法关联集合求助:Mongo Playground关联查询结果不符
解决MongoDB Lookup无法关联集合的问题
问题说明
我在Mongo Playground中对两个集合做关联查询,期望得到的结果如下:
[ { "_id": ObjectId("5a934e000102030405000000"), "id": 1, "name": "so1", "sop": [{ "id": "sop1", "value": "sopValue" }], "sops": [ { "id": "sop1", "name": "sopName" } ] } ]
作为MongoDB新手,我碰到了Lookup无法关联集合的问题,需要帮忙解决。
解决方案
核心问题定位
你的Lookup失效大概率是关联字段不匹配:要关联的sop.id是嵌套在数组里的字段,如果直接用数组字段去关联目标集合的字符串ID,类型不匹配就会查不出数据。
两种可行的聚合实现方式
方式一:用$unwind展开数组后关联(适合需要修改数组结构的场景)
db.so.aggregate([ // 展开sop数组,让每个数组元素单独成为一条文档 { $unwind: "$sop" }, // 关联sop集合,用展开后的sop.id匹配目标集合的id { $lookup: { from: "sop", localField: "sop.id", foreignField: "id", as: "sops" } }, // 展开关联得到的sops数组 { $unwind: "$sops" }, // 重新聚合回原文档结构,保留sop和sops数组 { $group: { _id: "$_id", id: { $first: "$id" }, name: { $first: "$name" }, sop: { $push: "$sop" }, sops: { $push: "$sops" } } } ])
方式二:用Lookup的子管道关联(更高效,无需展开数组)
这种方式直接在Lookup内部通过子管道匹配数组中的ID,避免了展开和重新聚合的操作:
db.so.aggregate([ { $lookup: { from: "sop", // 定义变量,获取当前文档中sop数组的所有id let: { sopIds: "$sop.id" }, // 子管道:匹配sop集合中id在sopIds数组里的文档 pipeline: [ { $match: { $expr: { $in: ["$id", "$$sopIds"] } } } ], // 关联结果存入sops字段 as: "sops" } } ])
验证结果
执行任意一种方式的聚合后,都能得到你期望的包含关联sops数据的结果。
内容的提问来源于stack exchange,提问作者nkare
相关产品推荐
相关产品推荐

