如何在MongoDB中关联含字符串Object ID数组的两个集合
解决方案
你可以使用MongoDB的聚合管道,通过$lookup阶段关联两个集合,再用$project或$addFields调整输出格式,具体实现代码如下:
db.store.aggregate([ { $lookup: { from: "Tag", // 目标关联集合名 localField: "Tags", // store集合中用于匹配的标签ID数组字段 foreignField: "_id", // Tag集合中对应的ID字段 as: "TagResult" // 存储关联结果的字段名 } }, { $project: { // 保留原文档的核心字段 _id: 1, name: 1, Tags: 1, updatedAt: 1, // 格式化TagResult,仅保留标签名称 TagResult: { $map: { input: "$TagResult", as: "tag", in: { name: "$$tag.name" } } } } } ])
代码说明
$lookup阶段:自动匹配store集合Tags数组中的每个ID与Tag集合的_id,将匹配到的完整标签文档存入TagResult数组。$project阶段:保留原文档的所有需要的字段,同时通过$map遍历关联得到的TagResult数组,只提取每个标签的name字段,转换成你需要的格式。
如果不需要保留updatedAt字段,可在$project中移除对应配置;若想直接新增TagResult字段而不修改原有字段结构,也可以用$addFields替代$project:
db.store.aggregate([ { $lookup: { from: "Tag", localField: "Tags", foreignField: "_id", as: "TagResult" } }, { $addFields: { TagResult: { $map: { input: "$TagResult", as: "tag", in: { name: "$$tag.name" } } } } } ])
执行上述聚合查询后,就能得到包含格式化TagResult数组的目标文档结构。
内容的提问来源于stack exchange,提问作者Sen Cai
相关产品推荐
相关产品推荐

