MongoDB如何按集合语义返回唯一数组列表而非唯一字符串
MongoDB按集合语义对数组去重实现方案
可以实现你需要的按集合语义去重的需求,核心思路是先统一数组元素的顺序,再基于排序后的数组进行分组去重。以下是具体的聚合管道:
db.collection.aggregate([ // 过滤存在且非空的letters字段 { $match: { "letters": { $exists: true, $ne: null } } }, // 对letters数组的元素按升序排序,统一相同元素集合的数组格式 { $addFields: { sortedLetters: { $sortArray: { input: "$letters", sortBy: 1 } } } }, // 以排序后的数组为分组键,实现集合语义去重 { $group: { _id: "$sortedLetters" } }, // 提取去重后的数组并调整字段名 { $project: { _id: 0, letters: "$_id" } }, // 将所有去重后的数组汇总到一个数组中 { $group: { _id: null, letters: { $push: "$letters" } } }, // 移除冗余的_id字段 { $project: { _id: 0 } } ])
各阶段说明:
$match:过滤掉letters字段不存在或为null的文档,确保只处理有效数据。$addFields:使用$sortArray操作符对每个letters数组的元素按升序排序,这样元素集合相同但顺序不同的数组会被转换成完全一致的格式(比如["b","a"]会变成["a","b"])。$group:以排序后的数组作为分组键,将所有集合语义相同的数组合并为一组,完成去重。- 后续
$project和$group:将去重后的数组整理成你需要的数组列表格式,最终返回结果为:{ "letters": [ ["a", "b"], ["a", "c"], ["b"], ["a"] ] }
内容的提问来源于stack exchange,提问作者Lucien Chardon
相关产品推荐
相关产品推荐

