MongoDB如何分组重复文档并生成去重排序的数字数组
问题根因
$addToSet 操作符仅负责对字段值去重汇总,不保证返回数组的元素顺序;你现有语句中的$sort阶段是对分组后的整条文档按name字段排序,不会处理文档内部number数组的元素顺序,因此无法得到升序排列的去重数组。
解决方案
适用 MongoDB 5.2+ 版本(写法最简洁)
分组后新增字段处理阶段,用$sortArray对内部的number数组直接排序即可:
user.aggregate([ { $group: { _id: '$name', name: { $first: '$name' }, number: {$addToSet: '$number'} } }, { $addFields: { number: { $sortArray: { input: '$number', sortBy: 1 } } } }, {$sort: {name: 1}} ])
兼容低版本 MongoDB 写法
如果你的MongoDB版本低于5.2不支持$sortArray,可以先拆分数组、排序后再重新聚合:
user.aggregate([ { $group: { _id: '$name', name: { $first: '$name' }, number: {$addToSet: '$number'} } }, { $unwind: '$number' }, { $sort: { name: 1, number: 1 } }, { $group: { _id: '$name', name: { $first: '$name' }, number: { $push: '$number' } } } ])
以上两种写法执行后都会返回你预期的结果:
[ { name:"bob", number: [10,20] }, { name:"kol", number: [10,20] } ]
注:你提供的原始示例数据中第4条记录末尾缺少逗号,执行测试前记得补上,否则会报语法错误。
内容的提问来源于stack exchange,提问作者prashant isotiya
相关产品推荐
相关产品推荐

