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



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

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

他们说,这将首先按年龄(降序)排序,然后按职位(升序)排序。

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

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

控制台是特殊的,它的对象实际上是按照不同于普通EMCAscript的顺序排列的,因此可以发生这种情况。

以下是一位10gen员工提出的相关问题,内容如下:https://stackoverflow.com/a/18514551/383478

除其他外,字段的顺序始终保持不变。

注意:值得注意的是,V8(从v2.2开始运行MongoDB shell和MR)在实践中已经对对象进行了排序。

在非V8 JS中,保持顺序的唯一真正方法是进行键查找,比如:如何在保持键查找的同时保持Javascript对象/数组的顺序?

是的,您对ECMAScript规范的看法是错误的。属性保留了它们的顺序,这就是为什么一些语言驱动程序(例如,默认情况下,Perl按键名对"hashes"进行排序,使用Tie::IxHash来更改)推荐在要转换的结构中也保持顺序的表单。

无论如何,这不是"真正的"JavaScript,但它是BSON。无论如何,这都是借用行为,所以语句实际上保持不变。将保留您指定的顺序。

最新更新