MongoDB字符串数组字段降序排序结果不符合预期是什么原因?
问题原因
MongoDB 对数组字段执行排序时遵循以下规则:
- 升序排序(
sort({field: 1})):默认取数组中最小的元素作为首要比较依据,最小元素相等时按数组元素逐位比较,长度更短的数组在逐位匹配前缀相同的情况下会排在前面。 - 降序排序(
sort({field: -1})):默认取数组中最大的元素作为首要比较依据,而非直接将升序结果完全反转。
对应你的测试数据:
三个数组的最大元素分别为:['111','222']最大为222,['222','333']最大为333,['111','222','333']最大为333。
降序时最大元素为333的两个文档排在最前,这两个文档最大元素相等,逐位比较次大值都是222,更长的数组会排在前面,所以最终得到你看到的非预期结果。
解决办法
- 方案1:小数据量场景下,先执行升序查询拿到符合预期的顺序结果,直接在应用层将结果列表反转,即可得到对应降序结果,实现成本最低。
- 方案2:数据库层面使用聚合管道实现自定义排序,新增辅助排序字段后再排序。比如你可以将数组拼接为字符串作为排序依据,示例代码如下:
db.user.aggregate([ { $addFields: { sortKey: { $reduce: { input: "$customs", initialValue: "", in: { $concat: ["$$value", "$$this"] } } } } }, { $sort: { sortKey: -1 } } ])
- 方案3:如果排序规则固定,可提前在文档中新增独立的排序冗余字段,比如把数组的每个位置元素拆分为
custom1、custom2、custom3独立字段,排序时直接按多个字段联合降序sort({custom1: -1, custom2: -1, custom3: -1}),性能最优。
内容的提问来源于stack exchange,提问作者jiqing liu
相关产品推荐
相关产品推荐

