如何在MongoDB中按指定ID分组文档并生成子文档结构
MongoDB实现分类文档嵌套子分类
你可以通过MongoDB聚合管道的$lookup自关联查询实现需求,无需使用$group。以下是完整查询语句:
db.category.aggregate([ // 自关联匹配子分类文档 { $lookup: { from: "category", localField: "child_category_ids", foreignField: "_id", as: "child_categories" } }, // 格式化输出字段,确保结构符合要求 { $project: { _id: 1, title: 1, depth: 1, parent_category_ids: 1, child_category_ids: 1, child_categories: { $map: { input: "$child_categories", as: "child", in: { _id: "$$child._id", title: "$$child.title", depth: "$$child.depth", parent_category_ids: "$$child.parent_category_ids", child_category_ids: "$$child.child_category_ids" } } } } } ])
各阶段说明
$lookup阶段
这是嵌入子分类的核心步骤:from: "category":指定关联集合为自身(子分类同属一个集合)localField: "child_category_ids":用当前文档的子分类ID数组作为关联键foreignField: "_id":匹配集合中_id与子分类ID一致的文档as: "child_categories":将匹配到的子分类文档数组存入child_categories字段
$project阶段
用于过滤和规范输出结构:- 显式保留原文档需要的字段(
_id、title等) - 用
$map遍历child_categories数组,只保留子分类文档中需要的字段(若无需过滤,直接写child_categories: 1即可)
- 显式保留原文档需要的字段(
补充说明
你的需求是给每个分类文档嵌入对应子分类,属于自关联查询场景,$group用于分组统计,不适合该场景,$lookup才是正确选择。
内容的提问来源于stack exchange,提问作者Taylor
相关产品推荐
相关产品推荐

