当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在mongodb中维护排序属性的顺序?》经验,为你挑选了1个好方法。

根据问题的答案,不保证对象的属性顺序.那么当我们将多个排序字段作为对象传递时,sort函数如何在MongoDB中完美地工作?

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

mongodb如何知道它首先必须按firstName排序然后按年龄排序?它是在做错误的假设吗?



1> str..:

这是个有趣的问题.

它可以作为最ECMAScript实现真正做到保持键顺序(这是通过使用节点,例如V8).但是,官方Node MongoDB驱动程序不鼓励使用它,而是提供两种不同的符号:

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

{   "sort": [['field1','asc'], ['field2','desc']] }

使用单个升序字段,可以使用字段名称替换该数组.

{   "sort": "name" }

Mongoose文档没有提到有关密钥顺序的任何内容(至少不是我所知道的).但它也提供了两种不同的排序方法:

// sort by "field" ascending and "test" descending
query.sort({ field: 'asc', test: -1 });

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

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

另请参阅这个非常相关的问题:如何在node.js中为MongoDB索引指定javascript对象中的属性顺序?


关于这个问题还有一个Mongoose问题:

是的,对于猫鼬和mongodb司机来说,这是一个不幸的困境.ECMAScript表示密钥没有订购,但它们实际上是在V8中订购的(数字键除外,这是一个令人讨厌的边缘情况),并且在可预见的将来可能会继续在V8中订购.如果您关心键顺序,可以使用[['field1','asc']]语法或特定于mongoose的'field1 -field2'语法或ES2015 Map类(保证键的插入顺序).

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

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有