在mongodb中如何维护sorting的属性?

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

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

mongodb如何知道它首先必须按姓氏sorting然后按年龄sorting? 它是在错误的假设上工作吗?

这是个有趣的问题。

它可以工作,因为大多数ECMAScript实现实际上保留了键的顺序(例如Node使用的V8)。 但是,官方的Node MongoDB驱动并不鼓励它的使用,而是提供了两种不同的符号:

sorting可以通过select参数sorting来获得,sorting参数sorting需要sorting偏好数组

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

使用单个升序字段可以将数组replace为字段的名称。

 { "sort": "name" } 

Mongoose文档没有提及任何有关键序(至less不是我所知道的)。 但它也提供了两种不同的sorting方法 :

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

事实上,似乎Mongoosesortingfunction是基于错误的(但目前有效的)假设。 用多个键sorting时,最好使用string符号。 我为此创build了一个Mongoose问题 。

当使用MongoDB直接使用MongoDB时(如在MongoDB shell中),使用对象表示法进行sorting可以正常工作,因为它不使用纯JSON,而是使用扩展JSON 。

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


与此同时,我为mongoose创build的问题已经结束:

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

因此,在使用Mongoose时,可以使用string符号或新增的对ES2015 Maps的支持,这些支持将保证按插入顺序进行sorting。

在你的例子中,你使用索引进行sorting操作在MongoDB中,如果你sorting与多个领域创build一个复合索引支持sorting在多个领域。 正如你在给索引时所做的那样,查询规划器从你的索引(你的例子的顺序:名字,姓氏)获得sorting顺序,它将按你的顺序sorting。 在另一个例子中,它是一个javascript对象。 JavaScript不保证sorting。