【问题标题】:Sorting in MongoDB shell with a custom order使用自定义顺序在 MongoDB shell 中排序
【发布时间】:2017-07-11 22:41:15
【问题描述】:

这源于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 } ] 
>

请注意,如果我多次执行同一行,它会逐渐排序越来越多,就好像这是在执行快速排序,但每次只有两个级别的递归。 谁能解释我做错了什么以及如何定义一次扫描的自定义顺序?

【问题讨论】:

  • 你在说什么? shell 只是一个普通的 JavaScript REPL,你只是用一个普通的 JavaScript Array.sort() 方法对一个普通的 JavaScript 数组进行排序。就像它应该的那样工作,当然不是你声称的那样。
  • 我能够验证上述断言。我将您的陈述复制到我的 Mongo shell 中并稍微混淆了数字。我得到的排序结果是预期的排序数组,而不是你描述的。对于它的价值,我使用了 v3.4.2。
  • 我正在使用 v3.0.10 并从客户端复制粘贴我的行。尼尔,我没有要求任何东西。

标签: javascript arrays mongodb sorting


【解决方案1】:

问题在于您在数组排序中使用的自定义比较函数。

旧版本的 JavaScript 引擎(例如,在 MongoDB 3.0 和更早的 shell 中使用的引擎)期望自定义比较函数将返回以下三个数值之一:正数(大于)、零(等于)或负数(小于比)。返回布尔值的比较函数具有未定义的结果(尽管合理期望这些应该被强制转换为它们的等效数字),因此结果取决于 JavaScript 引擎。

您应该使用返回数值的函数来获得预期的结果。

例如,这应该适用于mongo shell 的所有版本:

 alit.sort(function(a,b) {return a.a - b.a } )

注意:mongo 3.2 或更新版本中使用的更现代的 SpiderMonkey 引擎可以正确处理使用 > 的排序,因此您最初的自定义 sort() 将在最新版本的 shell 中按预期工作。

【讨论】:

  • 知道了。谢谢!它就像一个魅力。我找不到关于如何定义订单或订单如何随时间变化的良好文档,因此我非常感谢您的回复!
  • @ViniBono Array.sort() 行为存在于 JavaScript 引擎中,实现之间的差异一直是一个长期的抱怨(例如:stackoverflow.com/questions/3026281/…allenpike.com/2009/arraysort-browser-differencesstackoverflow.com/questions/42338978/…)。如果您正在执行任何重要的客户端编程或操作,通常最好在驱动程序实现(例如 Node.js、Python 等)而不是 mongo shell 中完成。
  • @ViniBono 您可以找到有关 MongoDB 发行说明中使用的 JavaScript 引擎的信息,最近的更改是 MongoDB 3.2 中的 move from V8 to SpiderMonkey(Mozilla 的 JS 引擎)。 mongo shell 包含一个命令 interpreterVersion(),如果你想确认你的 shell 正在使用什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 2014-03-15
  • 2015-05-12
相关资源
最近更新 更多