如何用单条MongoDB查询获取各字段独立的去重值?
MongoDB单查询获取多字段独立去重值方案
测试集合数据
{ "a": 10, "b": 20, "c": 30 } { "a": 11, "b": 20, "c": 31 } { "a": 10, "b": 20, "c": 31 }
核心问题:单查询获取已知字段的独立去重值
可以通过聚合管道实现,避免多次调用distinct的低效问题。以下查询直接返回每个字段的去重值集合:
db.collection.aggregate([ { $group: { _id: null, a_values: { $push: "$a" }, b_values: { $push: "$b" }, c_values: { $push: "$c" } } }, { $project: { _id: 0, a: { $setUnion: ["$a_values"] }, b: { $setUnion: ["$b_values"] }, c: { $setUnion: ["$c_values"] } } } ])
查询结果:
{ "a": [10, 11], "b": [20], "c": [30, 31] }
附加问题:字段列表未知时的通用实现
如果无法预先知道集合中的字段名,可利用MongoDB的$objectToArray、$arrayToObject等操作符实现通用方案:
db.collection.aggregate([ // 将每个文档转换为键值对数组(过滤_id字段可按需添加) { $project: { data: { $objectToArray: "$$ROOT" } } }, // 展开键值对数组 { $unwind: "$data" }, // 按字段名分组,自动收集去重后的值 { $group: { _id: "$data.k", values: { $addToSet: "$data.v" } } }, // 重组为键值对结构 { $project: { kv: { k: "$_id", v: "$values" }, _id: 0 } }, // 将数组转换为目标对象格式 { $replaceRoot: { newRoot: { $arrayToObject: "$kv" } } } ])
该方案会自动识别集合中的所有字段,返回每个字段对应的去重值数组,无需依赖预先定义的字段列表。
内容的提问来源于stack exchange,提问作者uvsmtid
相关产品推荐
相关产品推荐

