如何提取MongoDB集合字段去重值并映射到另一集合对应字段
MongoDB跨集合字段匹配映射实现方案
核心实现逻辑
- 先对集合1的指定关联字段(示例中为
Name)去重,得到唯一值列表 - 通过聚合管道的
$lookup操作关联集合2,匹配相同关联字段的记录 - 对关联后的结果二次去重,最终输出需要的关联字段和目标字段组合
完整查询代码
db.collection1.aggregate([ // 对集合1的Name字段去重,获取所有唯一姓名 { $group: { _id: "$Name" } }, // 关联集合2,匹配相同Name的记录 { $lookup: { from: "collection2", localField: "_id", foreignField: "Name", as: "expiry_info" } }, // 展开关联得到的数组 { $unwind: "$expiry_info" }, // 对Name+Expiry组合去重,剔除重复数据 { $group: { _id: { Name: "$_id", Expiry: "$expiry_info.Expiry" } } }, // 调整输出格式,隐藏默认_id字段 { $project: { _id: 0, Name: "$_id.Name", Expiry: "$_id.Expiry" } } ])
输出结果
针对你提供的示例数据,运行上述查询后得到如下结果:
[ { "Name": "Radan", "Expiry": "2021-08-09" }, { "Name": "Dammy", "Expiry": "2021-08-07" } ]
补充说明
如果集合2中同一个Name对应多个不同的Expiry值,上述代码会全部输出;如果仅需要获取最新的有效期,可以将第四步的$group修改为按Name分组,用$max操作符取最大的Expiry值即可。
内容的提问来源于stack exchange,提问作者Didi
相关产品推荐
相关产品推荐

