Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MongoDB多重排序属性:如何确定优先级?_Javascript_Mongodb_Ecmascript 5 - Fatal编程技术网

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

Javascript MongoDB多重排序属性:如何确定优先级?,javascript,mongodb,ecmascript-5,Javascript,Mongodb,Ecmascript 5,根据Mongo的文档,您可以指定多个排序键,如下所示: { $sort : { age : -1, posts: 1 } } 他们说会先按年龄(降序)排序,然后按帖子(升序)排序 但是排序查询是一个Javascript对象。据我所知,虽然实现通常按照属性创建的顺序对属性进行迭代,但这实际上并不是ECMAScript规范的一部分:对象属性正式没有顺序 MongoDB真的依赖于任意行为吗?这些行为可能因实现的不同而有所不同,我对ECMAScript规范的理解是否错误,或者我是否在Mongo文档中遗

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

{ $sort : { age : -1, posts: 1 } }
他们说会先按年龄(降序)排序,然后按帖子(升序)排序

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


MongoDB真的依赖于任意行为吗?这些行为可能因实现的不同而有所不同,我对ECMAScript规范的理解是否错误,或者我是否在Mongo文档中遗漏了一些可以让您以其他方式调整优先级的内容

是的,您对ECMAScript规范的理解是错误的。属性保留其顺序,这就是为什么对于某些语言的驱动程序(例如,Perl命令按键名“哈希”,默认情况下,使用Tie::IxHash来更改该顺序),您会推荐在要转换的结构中也保持顺序的表单


无论如何,这不是“真正的”JavaScript,而是BSON。无论如何,这是一种借来的行为,所以这句话实际上是一成不变的。您指定的顺序将被保留。

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

以下是一个来自10gen员工的链接问题,该问题说明:

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

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


在非v8js中,保持秩序的唯一正确方法是执行关键查找,如:

自2011年起,规范明确表示对象属性没有序列。你有没有一个链接指向更高版本的其他版本?另外,我很确定Mongo运行V8。。。文档存储在BSON(这是一种数据格式,不是执行上下文…?)中,但查询是在V8(Javascipt)中执行的。这就是我发现它声明没有保证序列的地方。不过我还没有检查Harmony。FWIW,JSON规范还说对象属性没有保证的序列,BSON是JSON派生的(这并不意味着它不会改变这种行为,但这似乎是一致的)。@分号顺序将始终按照指定的顺序保留。正如我所说的,在其他语言中,可翻译结构在默认情况下通常是按顺序排列的,您需要应用一些方法来确保顺序得到保留。但我不知道这适用于JavaScript、JSON或BSON的情况。因此,无论您阅读的是什么,都似乎是不正确的。我正在阅读ECMAScript规范。的确,V8和除某些IE版本外的所有浏览器都保留了序列,但这是未指定的行为(显然早期版本的V8也没有保留序列)。不管事实与否,Mongo会依赖它,这让我感到奇怪@分号我所说的是产生一个例子,我所说的不是真的,然后你有你自己的答案。如果你不能,那么我说的是真的。这就是我们解决问题的基本方法。反驳或证明一个陈述谢谢Sammaye。我本应该把这个问题说得更清楚:我知道它会因为V8而工作,但我问题的重点不是“它会工作吗?”而是“它是这样实现的吗?”我想可能有更明确的方式来声明序列。10gen的答案很好地总结了Neil所说的话,只是它承认V8之外的JS可能不会有相同的行为,这让我觉得很奇怪(我有时会有来自客户端的查询——所以是JS/JSON端到端的,但我不能100%确定属性顺序是否被保留)。@分号是吗?他说EMCAScript按规格持有订单,但我说外壳是特殊的。他说控制台实际上是用BSON编写的,这也不是真的,你是对的,它是EMCAScript,V8变体。在我看来很不一样,但还行。如果您有来自node.js的查询,它们将被排序,但如果您有来自浏览器的查询,则无法保证对象的顺序。@分号我想您可以在浏览器中进行键查找以保持顺序:这也可以允许您以不同的方式声明序列。不管怎样,这是他的主要观点,据我所知,我猜这“不应该是个问题”是什么意思?我对BSON的说法感到困惑,但在这一点上我不是100%确定。在做这项研究时,我惊讶地发现浏览器在实现上有多大的差异:。我现在的解决方案是将浏览器中的排序参数作为数组传递,并在服务器端创建排序对象。(如果您想稍微调整答案,说明属性序列是指定优先级的唯一方法,我将继续并将其标记为已接受。)@Semicolon V8是特殊的,它在允许有序对象方面违反了规范,目前仅在opera和chrome中实现。嗯,答案是spidermonkey现在也维持秩序,firefox已经知道会复制谷歌,所以可能。。。