MongoDB 数组关联字段下嵌套lookup多集合聚合查询实现求助
MongoDB三集合关联嵌套聚合查询解决方案
问题原因
你当前的写法会将关联得到的Collection 3数据作为顶层独立数组返回,无法自动匹配嵌入到每一个Collection 2的子文档中,是因为直接对collection_2_documents.collection_3_id做关联时,MongoDB只会返回全量匹配的Collection 3数据集,不会自动做子文档级别的挂载。
推荐写法(MongoDB 3.6及以上版本)
利用$lookup支持嵌套pipeline的能力,直接在关联Collection 2的阶段完成Collection 3的嵌套关联,逻辑更简洁:
[ { $lookup: { from: "Collection 2", localField: "collection_2_ids", foreignField: "_id", as: "collection_2_documents", // 嵌套pipeline为每个Collection 2文档关联对应的Collection 3 pipeline: [ { $lookup: { from: "Collection 3", localField: "collection_3_id", foreignField: "_id", as: "collection_3_document" } }, // 将lookup返回的数组拆为单个对象,符合预期输出格式 { $unwind: "$collection_3_document" } // 若存在无对应Collection 3的场景,可替换为以下写法避免文档被过滤: // { $unwind: { path: "$collection_3_document", preserveNullAndEmptyArrays: true } } ] } } ]
兼容低版本写法(MongoDB 3.6以下)
如果你的数据库版本不支持嵌套pipeline,可以通过拆分+分组的方式实现:
[ { $lookup: { from: "Collection 2", localField: "collection_2_ids", foreignField: "_id", as: "collection_2_documents" } }, { $unwind: "$collection_2_documents" }, { $lookup: { from: "Collection 3", localField: "collection_2_documents.collection_3_id", foreignField: "_id", as: "collection_2_documents.collection_3_document" } }, { $unwind: "$collection_2_documents.collection_3_document" }, // 按Collection 1的主键重新分组,合并回Collection 2数组 { $group: { _id: "$_id", name: { $first: "$name" }, collection_2_documents: { $push: "$collection_2_documents" } } } ]
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

