这源于how to sort array inside collection record in mongoDB
提供的示例> alit=[{a:16},{a:15},{a:14},{a:13},{a:12},{a:11},{a:10},{a:9},{a:8},{a:7},{a:6},{a:5},{a:4},{a:3},{a:2},{a:1},{a:0}]
> alit.sort(function(a,b) {return a.a>b.a } )
[ { "a":8 }, { "a":0 }, { "a":7 }, { "a":14 }, { "a":12 }, { "a":11 }, { "a":10 }, { "a":9 }, { "a":1 }, { "a":13 }, { "a":6 }, { "a":5 }, { "a":4 }, { "a":3 }, { "a":2 }, { "a":15 }, { "a":16 } ]
>
请注意,如果我多次执行同一行,它会越来越多地逐步排序,就好像这是执行快速排序但每次只有两级递归。 任何人都可以解释我做错了什么,以及如何定义一次扫描的自定义订单?
答案 0 :(得分:0)
问题在于您在数组排序中使用的自定义比较功能。
较旧版本的JavaScript引擎(例如,MongoDB 3.0和早期shell中使用的那些)期望自定义比较函数将返回三个数值中的一个:正数(大于),零(相等)或负数(小于比)。返回布尔值的比较函数具有未定义的结果(尽管合理地期望它们应该被强制转换为它们的数字等价物),因此结果取决于JavaScript引擎。
您应该使用返回数值的函数获得预期结果。
例如,这应该适用于mongo
shell的所有版本:
alit.sort(function(a,b) {return a.a - b.a } )
注意:mongo
3.2或更新版本中使用的更现代的SpiderMonkey引擎使用>
正确处理排序,因此您的原始自定义sort()
将在最新版本的shell中按预期工作。