Javascript mongodb中如何维护排序的属性顺序?
根据对问题的回答,对象上属性的顺序无法保证。那么,当我们将多个排序字段作为一个对象传递时,排序函数如何在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中使用索引进行排序操作,如果您使用多个字段进行排序,则会创建一个复合索引以支持对多个字段进行排序。正如您在给出索引时所做的那
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');