根据question的答案,不能保证对象上属性的顺序。那么当我们将多个排序字段作为对象传递时,排序功能如何在MongoDB中完美地工作?
db.users.find({}).sort({firstName: 1, age:-1}).exec(callback);
mongodb如何知道它首先必须按firstName进行排序,然后再按年龄进行排序?它是否基于错误的假设?
最佳答案
这是个有趣的问题。
它可以像大多数ECMAScript实现实际上确实保留键顺序一样工作(例如,Node使用的V8)。但是,官方的Node MongoDB driver不鼓励使用它,而是提供了两种不同的表示法:
Mongoose 的文档没有提及任何有关按键顺序的内容(至少我不知道)。但它也提供two different approaches to sorting:
实际上,Mongoose排序功能似乎是基于错误(但当前有效)的假设。最好是在对多个键进行排序时使用字符串表示法。
直接使用MongoDB时(例如在MongoDB shell中),使用对象符号排序可以正常工作,因为它不使用纯JSON,而是使用extended JSON。
另请参阅此非常相关的问题:How can you specify the order of properties in a javascript object for a MongoDB index in node.js?
关于此还有一个Mongoose issue:
因此,在使用Mongoose时,请使用字符串符号或新添加的对ES2015 Maps的支持,这些保证可以通过插入顺序进行排序。