You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 01:06:26