MongoDB多种排序属性:如何确定优先级?

时间:2014-08-31 06:30:45

标签: javascript mongodb ecmascript-5

根据Mongo的文档,您可以指定多个排序键:

{ $sort : { age : -1, posts: 1 } }

他们说首先按年龄(降序)排序,然后按帖子(升序)排序。

但是排序查询是一个Javascript对象。据我所知,虽然实现通常按照创建顺序迭代属性,但实际上并不是ECMAScript规范的一部分:对象属性正式没有顺序。

MongoDB是否真的依赖于可能因实现而异的任意行为,我对ECMAScript规范是错误的,还是我在Mongo文档中遗漏了一些让你以其他方式调整优先级的东西?

2 个答案:

答案 0 :(得分:1)

是的,您对ECMAScript规范有误。属性保留了它们的顺序,这就是为什么有一些语言驱动程序(例如默认情况下按键名称命令Perl命令“哈希”,使用Tie :: IxHash来改变它)推荐的形式也保持要转换的结构中的顺序。

无论如何,这不是“真正的”JavaScript,但它是BSON。无论如何这是借来的行为,所以声明真的保持不变。您指定的订单将被保留。

答案 1 :(得分:1)

控制台很特别,它的对象实际上与普通EMCAscript不同,因此可能会发生这种情况。

以下是来自10gen员工的链接问题:https://stackoverflow.com/a/18514551/383478

  

除其他外,始终保留字段顺序。

N.B:值得注意的是V8(从v2.2开始运行MongoDB shell和MR)无论如何都在实际中对对象进行了排序。

非V8 JS保持秩序的唯一真正方法是执行键查找,例如:How to keep an Javascript object/array ordered while also maintaining key lookups?