根据Mongo的文档,您可以指定多个排序键:
{ $sort : { age : -1, posts: 1 } }
他们说首先按年龄(降序)排序,然后按帖子(升序)排序。
但是排序查询是一个Javascript对象。据我所知,虽然实现通常按照创建顺序迭代属性,但实际上并不是ECMAScript规范的一部分:对象属性正式没有顺序。
MongoDB是否真的依赖于可能因实现而异的任意行为,我对ECMAScript规范是错误的,还是我在Mongo文档中遗漏了一些让你以其他方式调整优先级的东西?
答案 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?