【问题标题】:How is order of properties maintained for sort in mongodb?如何在 mongodb 中维护排序的属性顺序?
【发布时间】:2017-06-10 13:45:25
【问题描述】:

根据question 的答案,不能保证对象的属性顺序。那么当我们将多个排序字段作为对象传递时,排序功能如何在 MongoDB 中完美运行?

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

mongodb 怎么知道它首先必须按名字排序,然后按年龄?它是基于错误的假设吗?

【问题讨论】:

  • 因为您明确告诉 mongodb 按 firstName 然后按年龄排序
  • Mongodb 驱动程序实现确实需要以与 ECMAScript 标准相矛盾的方式运行。已经在这里回答了:stackoverflow.com/a/18514551/5309460
  • @Meni 不,他们不需要这样做。例如,官方的 Node 驱动程序有不同的语法来按多个字段排序。

标签: javascript node.js mongodb sorting mongoose


【解决方案1】:

这是一个有趣的问题。

它就像大多数 ECMAScript 实现一样保留键顺序(例如 Node 使用的 V8)。但是,官方Node MongoDB driver 并不鼓励使用它,而是提供了两种不同的符号:

可以使用带有数组的选项参数 sort 来实现排序 排序偏好

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

对于单个升序字段,数组可以替换为字段的名称。

{   "sort": "name" }

Mongoose 文档没有提到任何关于键顺序的内容(至少我不知道)。但它也提供two different approaches to sorting

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

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

确实,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 和 mongodb 来说都是一个不幸的困境 司机。 ECMAScript 说键是无​​序的,但它们是 实际在 V8 中排序(数字键除外,这是一个讨厌的边缘 情况下),并且可能会继续在 V8 中订购 可预见的未来。 您可以使用 [['field1', 'asc']] 语法或 mongoose 特定的 'field1 -field2' 语法或 ES2015 Map 类 (保证键的插入顺序)如果您担心 键顺序。

所以在使用 Mongoose 时,要么使用字符串表示法,要么使用新添加的ES2015 Maps 支持,保证按插入顺序排序。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-05-19
      • 2019-07-12
      • 2014-09-29
      • 2016-12-19
      • 2020-07-31
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多