MongoDB中如何将BlogCategory的ObjectId数组关联填充子分类文档?
解决MongoDB中父分类关联填充所有子分类的问题
嘿,我懂你现在的困扰:你原本想把BlogCategory里的子分类ID数组全部填充为对应的SubBlogCategory文档,但用了$unwind后,每个父分类都被拆成了多条记录,每条只关联了一个子分类。其实根本不需要用$unwind,MongoDB的$lookup本身就支持直接对数组类型的字段进行关联匹配。
正确的聚合查询写法
直接对subcategory数组字段使用$lookup,MongoDB会自动遍历数组中的每个ObjectId,匹配SubBlogCategory集合中的对应文档,并把结果作为一个新数组返回:
db.BlogCategory.aggregate([ { $lookup: { from: "SubBlogCategory", localField: "subcategory", foreignField: "_id", as: "subcategory_details" } } ])
执行这个查询后,你会得到每个BlogCategory文档都新增了一个subcategory_details字段,里面是对应的子分类文档数组,示例结果如下:
{ "_id" : ObjectId("5af2c6e8bfab7269e9a42ded"), "title" : "Javascript", "subcategory" : [ ObjectId("5af29fcc9a52623b7088ef4e"), ObjectId("5aebf78681273424e5f55ecc") ], "subcategory_details" : [ { "_id" : ObjectId("5af29fcc9a52623b7088ef4e"), "title" : "Reactjs" }, { "_id" : ObjectId("5aebf78681273424e5f55ecc"), "title" : "Vuejs" } ] }
可选:替换原有的subcategory字段
如果你想直接把原来的subcategoryID数组替换为填充后的子分类文档,可以加上$addFields和$project来调整结构:
db.BlogCategory.aggregate([ { $lookup: { from: "SubBlogCategory", localField: "subcategory", foreignField: "_id", as: "subcategory_details" } }, { $addFields: { subcategory: "$subcategory_details" // 用填充后的文档替换原ID数组 } }, { $project: { subcategory_details: 0 // 移除临时字段 } } ])
为什么原来的查询不行?
你之前用$unwind: "$subcategory"会把每个父分类文档拆分成多条记录,每条记录只包含一个子分类ID,之后的$lookup只能为拆分后的每条记录匹配单个子分类文档,最后得到的是多条父分类记录(每个子分类对应一条),而不是你想要的“一个父分类带着所有子分类文档”的结构。
内容的提问来源于stack exchange,提问作者Manoj Khatri
相关产品推荐
相关产品推荐

