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

如何对MongoDB集合中字符串格式数值字段按数字顺序去重排序?

问题

MongoDB集合中存储的数值以字符串格式保存,想要获取去重后的数值并按数字顺序排序,当前查询结果仅能按字符串字典序排列,不符合需求。

示例数据

[
  {
    id: "1"
  },
  {
    id: "1005"
  },
  {
    id: "50"
  },
  {
    id: "110"
  },
  {
    id: "1157"
  },
  {
    id: "9"
  },
  {
    id: "447"
  }
]

当前查询语句

db.collection.aggregate([
  {
    $group: {
      _id: "$id"
    }
  },
  {
    $sort: {
      _id: 1
    }
  }
])

当前输出(按字符串字典序)

[
  {
    "_id": "1"
  },
  {
    "_id": "1005"
  },
  {
    "_id": "110"
  },
  {
    "_id": "1157"
  },
  {
    "_id": "447"
  },
  {
    "_id": "50"
  },
  {
    "_id": "9"
  }
]

解决方案

核心思路是将字符串类型的id转换为数值类型后再排序,以下是两种可行的实现方式:

方法一:分组时转换类型(推荐,性能更优)

在分组阶段同时将字符串id转为整数类型,基于转换后的数值排序,最后可移除临时字段:

db.collection.aggregate([
  {
    $group: {
      _id: "$id",
      numId: { $toInt: "$id" }
    }
  },
  {
    $sort: { numId: 1 }
  },
  {
    $project: { numId: 0 }
  }
])

方法二:排序阶段直接转换类型(简化管道)

适用于MongoDB 4.0+版本,直接在排序阶段使用表达式转换类型:

db.collection.aggregate([
  { $group: { _id: "$id" } },
  { $sort: { $toInt: "$_id": 1 } }
])

正确输出结果

[
  { "_id": "1" },
  { "_id": "9" },
  { "_id": "50" },
  { "_id": "110" },
  { "_id": "447" },
  { "_id": "1005" },
  { "_id": "1157" }
]

关键说明

  • $toInt操作符负责将字符串转换为整数,确保排序时按数值大小而非字符串字典序比较。
  • 方法一仅在分组阶段转换一次类型,处理的是去重后的数据,性能优于方法二(方法二排序时需逐个转换)。

内容的提问来源于stack exchange,提问作者sfgroups

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 12:18:19