MongoDB聚合中拼接多表lookup数据生成complete_slug字段的方法
解决方案:MongoDB聚合中新增拼接slug字段
要在已有的聚合查询中添加complete_slug字段,只需在所有$lookup及对应的$unwind阶段之后,新增一个$addFields阶段,利用$concat操作符拼接三个slug值即可。
完善后的完整聚合查询
db.stories.aggregate([ // 关联category集合并展开数组 { $lookup: { from: "categories", localField: "category_id", foreignField: "_id", as: "category" } }, { $unwind: "$category" }, // 关联subcategory集合并展开数组 { $lookup: { from: "subcategories", localField: "subcategory_id", foreignField: "_id", as: "subcategory" } }, { $unwind: "$subcategory" }, // 关联stickers集合 { $lookup: { from: "stickers", localField: "sticker_ids", foreignField: "_id", as: "stickers" } }, // 关联prefixes集合并展开数组 { $lookup: { from: "prefixes", localField: "prefix_id", foreignField: "_id", as: "prefix" } }, { $unwind: "$prefix" }, // 新增complete_slug字段 { $addFields: { complete_slug: { $concat: [ "$category.slug", "/", "$subcategory.slug", "/", "$slug" ] } } } ])
关键说明
- 必须展开关联数组:因为
$lookup返回的是数组类型结果,所以必须用$unwind将category和subcategory数组展开为单个对象,否则无法直接访问category.slug和subcategory.slug字段。 - 空值处理(可选):如果存在关联数据可能为空的场景,可以用
$ifNull避免拼接失败,示例如下:complete_slug: { $concat: [ { $ifNull: ["$category.slug", ""] }, "/", { $ifNull: ["$subcategory.slug", ""] }, "/", { $ifNull: ["$slug", ""] } ] }
效果对比
- 当前返回结果(无complete_slug):
{ "_id": ObjectId("1"), "slug": "my-story", "category": { "_id": ObjectId("cat1"), "slug": "tech" }, "subcategory": { "_id": ObjectId("subcat1"), "slug": "programming" }, // 其他关联字段... } - 期望返回结果(新增complete_slug):
{ "_id": ObjectId("1"), "slug": "my-story", "category": { "_id": ObjectId("cat1"), "slug": "tech" }, "subcategory": { "_id": ObjectId("subcat1"), "slug": "programming" }, "complete_slug": "tech/programming/my-story", // 其他关联字段... }
内容的提问来源于stack exchange,提问作者Shreyas H
相关产品推荐
相关产品推荐

