如何从MongoDB多文档的对象数组中获取去重值?
嘿,要从多个MongoDB文档的Data数组里提取去重的Client值,用聚合框架就能完美解决,我给你分享两种实用方法:
方法1:使用$unwind + $group(兼容大部分MongoDB版本)
这是最经典的实现方式,思路是先把数组拆分为独立文档,再通过分组自动去重:
db.collection.aggregate([ // 将每个文档的Data数组拆分成单个独立文档 { $unwind: "$Data" }, // 按Data.Client字段分组,自动实现去重 { $group: { _id: "$Data.Client" } }, // 可选:将分散的去重结果整理为一个友好的数组格式 { $group: { _id: null, uniqueClients: { $push: "$_id" } } }, { $project: { _id: 0, uniqueClients: 1 } } ])
说明:前两步已经能得到所有去重的Client值,最后两步是把单个的结果文档合并成一个包含所有去重值的数组,方便一次性查看。
方法2:使用$reduce + $setUnion(MongoDB 3.4+,更高效)
如果不想拆分数组(避免生成大量中间文档),可以用数组操作符直接处理,性能更优:
db.collection.aggregate([ // 先提取每个文档中Data数组里的所有Client值,形成单独的数组 { $project: { clients: "$Data.Client" } }, // 合并所有文档的clients数组,同时用$setUnion保证无重复值 { $group: { _id: null, uniqueClients: { $reduce: { input: "$clients", initialValue: [], in: { $setUnion: ["$$value", "$$this"] } } } } }, { $project: { _id: 0 } } ])
说明:$setUnion本身就会返回两个数组的并集(自动去重),配合$reduce可以逐个合并所有文档的Client数组,最终得到全局去重的列表。
内容的提问来源于stack exchange,提问作者vikas gupta
相关产品推荐
相关产品推荐

