Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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_Node.js_Mongodb_Sorting_Mongoose - Fatal编程技术网

Javascript mongodb中如何维护排序的属性顺序?

Javascript mongodb中如何维护排序的属性顺序?,javascript,node.js,mongodb,sorting,mongoose,Javascript,Node.js,Mongodb,Sorting,Mongoose,根据对问题的回答,对象上属性的顺序无法保证。那么,当我们将多个排序字段作为一个对象传递时,排序函数如何在MongoDB中完美地工作呢 db.users.find({}).sort({firstName: 1, age:-1}).exec(callback); mongodb如何知道它必须先按名字排序,然后再按年龄排序?这是基于错误的假设吗?在您的示例中,您在MongoDB中使用索引进行排序操作,如果您使用多个字段进行排序,则会创建一个复合索引以支持对多个字段进行排序。正如您在给出索引时所做的那

根据对问题的回答,对象上属性的顺序无法保证。那么,当我们将多个排序字段作为一个对象传递时,排序函数如何在MongoDB中完美地工作呢

db.users.find({}).sort({firstName: 1, age:-1}).exec(callback);

mongodb如何知道它必须先按名字排序,然后再按年龄排序?这是基于错误的假设吗?

在您的示例中,您在MongoDB中使用索引进行排序操作,如果您使用多个字段进行排序,则会创建一个复合索引以支持对多个字段进行排序。正如您在给出索引时所做的那样,查询计划器从索引中获取排序顺序(示例的顺序:firstname,lastname),并将按照您的顺序进行排序。在另一个示例中,它是一个javascript对象。Javascript不保证排序。

这是一个有趣的问题

它的工作原理与大多数ECMAScript实现实际保留键顺序的方式相同(例如,节点使用的V8)。然而,官方并不鼓励使用它,而是提供了两种不同的符号:

可以使用选项参数sort进行排序,该参数采用数组 排序首选项

{   "sort": [['field1','asc'], ['field2','desc']] }
使用单个升序字段,可以用字段名称替换数组

{   "sort": "name" }
Mongoose文档没有提到任何关于密钥顺序的内容(至少我不知道)。但它也提供:

事实上,Mongoose排序功能似乎基于错误(但目前有效)的假设。在使用多个键进行排序时,最好使用字符串表示法。 直接使用MongoDB(例如在MongoDB shell中)时,使用对象表示法进行排序可以正常工作,因为它不使用纯JSON,而是使用JSON

还可以看到这个非常相关的问题:


关于这一点,还有一个问题:

是的,这对猫鼬和猫鼬来说都是一个不幸的困境 司机。ECMAScript说键不是按顺序排列的,但它们是按顺序排列的 实际上是在V8中订购的(除了数字键,这是一个令人讨厌的边缘 案例),并且可能会继续在V8中订购 可预见的未来您可以使用[['field1',asc']]语法或 mongoose特定的“field1-field2”语法或ES2015映射类 (这保证了键的插入顺序)如果您关心 关键订单。


因此,在使用Mongoose时,要么使用字符串表示法,要么使用新添加的支持,这些支持保证按插入顺序排序。

因为您明确告诉mongodb先按名字排序,然后再按ageMongodb排序。驱动程序实现的行为确实需要与ECMAScript标准相矛盾。这里已经有人回答:@Meni不,他们不需要这样做。例如,官方节点驱动程序使用不同的语法按多个字段排序。
// sort by "field" ascending and "test" descending
query.sort({ field: 'asc', test: -1 });

// equivalent
query.sort('field -test');