如何对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
相关产品推荐
相关产品推荐

