MongoDB聚合查询中使用lookup关联比较集合与数组数据的实现方案
这个需求完全可以通过MongoDB的聚合框架实现,具体实现步骤和代码如下:
核心实现逻辑
- 匹配chat集合中id为
test1的目标文档 - 对tags数组做去重处理,生成
setTags字段 - 通过带
let和pipeline的$lookup关联tag集合,筛选出key属于去重后tags的所有标签文档 - 调整输出结构匹配要求的返回格式
完整聚合查询代码
db.chat.aggregate([ // 匹配id为test1的chat文档 { $match: { id: "test1" } }, // 对tags数组去重生成setTags字段 { $addFields: { setTags: { $setUnion: ["$tags", []] } } }, // 关联tag集合,筛选匹配的标签文档 { $lookup: { from: "tag", let: { tagKeys: "$setTags" }, pipeline: [ { $match: { $expr: { $in: ["$key", "$$tagKeys"] } } } ], as: "tagList" } }, // 调整输出结构为期望格式 { $project: { _id: 0, chat: [ { id: "$id", setTags: "$setTags" } ], tag: "$tagList" } } ])
代码说明
$setUnion操作符会自动对数组元素去重,无需额外分组操作,执行效率更高$lookup中通过let把当前chat文档的去重标签列表传入子管道,用$expr结合$in筛选出所有匹配的tag文档- 最终
$project阶段按照要求组装返回结构,和你给出的期望返回示例完全一致
内容的提问来源于stack exchange,提问作者GYEONGSEOP KIM
相关产品推荐
相关产品推荐

