如何将三个MongoDB查询合并为单个查询关联多集合
合并MongoDB多集合查询实现结构化结果
你可以通过MongoDB的聚合框架,使用$lookup关联多个集合,再配合$addFields、$map等操作整理嵌套结构,一次性得到目标结果。以下是具体的聚合查询语句:
db.category.aggregate([ // 关联subcategory集合,获取当前分类下的子分类 { $lookup: { from: "subcategory", localField: "_id", foreignField: "categoryId", as: "subcategory" } }, // 关联store集合,获取当前分类下的所有店铺 { $lookup: { from: "store", localField: "_id", foreignField: "categoryId", as: "store" } }, // 先获取所有子分类的全局映射,用于店铺匹配 { $lookup: { from: "subcategory", localField: null, foreignField: null, as: "allSubcategories" } }, // 处理子分类和店铺的字段替换 { $addFields: { "subcategory": { $map: { input: "$subcategory", as: "subcat", in: { _id: "$$subcat._id", name: "$$subcat.name", categoryId: { _id: "$_id", name: "$name" } } } }, "store": { $map: { input: "$store", as: "shop", in: { _id: "$$shop._id", name: "$$shop.name", categoryId: { _id: "$_id", name: "$name" }, subCategoryId: { $arrayElemAt: [ { $filter: { input: "$allSubcategories", cond: { $eq: [ "$$this._id", // 兼容store中拼写错误的subCatgeoryId字段 { $ifNull: ["$$shop.subCategoryId", "$$shop.subCatgeoryId"] } ] } } }, 0 ] } } } } } }, // 移除临时的全局子分类数组 { $project: { allSubcategories: 0 } }, // 包装成目标顶层结构 { $group: { _id: null, category: { $push: "$$ROOT" } } }, { $project: { _id: 0, category: 1 } } ])
关键步骤说明:
$lookup:三次关联操作分别获取分类对应的子分类、分类对应的店铺,以及所有子分类的全局数据(用于店铺匹配)。$map:遍历子分类和店铺数组,将原本的ID引用替换为对应文档的完整信息。$filter+$arrayElemAt:根据店铺的子分类ID(兼容拼写错误的字段),从全局子分类数组中匹配对应的子分类信息。$group+$project:将最终结果整理成你需要的顶层category数组结构。
内容的提问来源于stack exchange,提问作者Shreyas H
相关产品推荐
相关产品推荐

