MongoDB一对多嵌套数组Lookup查询:子分类名称无法正确渲染
MongoDB 聚合查询嵌套数组 Lookup 关联子分类名称解决方案
集合结构示例
advertisements 集合文档
{ "_id": ObjectId("60d21b4667d0d8992e610c85"), "title": "促销广告", "categories": [ObjectId("60d21b4667d0d8992e610c86"), ObjectId("60d21b4667d0d8992e610c87")] }
categories 集合文档
{ "_id": ObjectId("60d21b4667d0d8992e610c86"), "name": "电子产品" }, { "_id": ObjectId("60d21b4667d0d8992e610c87"), "name": "家用电器" }
常见问题原因
直接用$lookup关联后,返回的是完整的分类文档数组,若未做字段提取或映射,就会出现子分类名称无法单独渲染的情况。
修正后的聚合查询
场景1:将分类ID数组替换为名称数组
db.advertisements.aggregate([ { $lookup: { from: "categories", localField: "categories", foreignField: "_id", as: "categoryDetails" } }, { $project: { title: 1, categories: { $map: { input: "$categoryDetails", as: "cat", in: "$$cat.name" } } } } ])
场景2:保留原分类ID,同时添加对应名称
db.advertisements.aggregate([ { $lookup: { from: "categories", localField: "categories", foreignField: "_id", as: "categoryDetails" } }, { $project: { title: 1, categories: { $map: { input: "$categories", as: "catId", in: { _id: "$$catId", name: { $arrayElemAt: [ "$categoryDetails.name", { $indexOfArray: ["$categoryDetails._id", "$$catId"] } ] } } } } } } ])
核心逻辑说明
$lookup负责将advertisements的categories数组与categories集合关联,返回完整分类文档到categoryDetails数组$map遍历目标数组,配合$indexOfArray和$arrayElemAt精准匹配每个分类ID对应的名称- 如果你的
categories数组是更复杂的嵌套结构,只需调整$map的输入和字段映射规则即可适配
期望输出示例(场景1)
{ "_id": ObjectId("60d21b4667d0d8992e610c85"), "title": "促销广告", "categories": ["电子产品", "家用电器"] }
内容的提问来源于stack exchange,提问作者Karthickkumar Kalimuthu
相关产品推荐
相关产品推荐

