【问题标题】:MongoDB: Sorting by date treats null field as earlier dateMongoDB:按日期排序将空字段视为较早的日期
【发布时间】:2013-04-07 18:27:53
【问题描述】:

Mongoose 架构包括:

{
  dueDate: { type: Date, required: false }
}

我的目标是获取按dueDate 排序的文档,其中最早的日期在顶部,然后是没有dueDate 的其余文档。我的问题是不需要截止日期,因此没有截止日期的文档会排在具有有效日期的文档之上。

这就是我的排序方式(node.js 和 mongoose.js):

query.sort({ dueDate: 'asc' });

我主要是在寻找一种内置的方法来做到这一点;我已经通过组合查询实现了一个 hack。

【问题讨论】:

  • en.wikipedia.org/wiki/Lexicographical_order 执行此操作,如果您希望这些值显示在底部,则需要为日期创建一个“最大值”并使用该最大值作为默认值来初始化您的文档。
  • 不幸的是,还有其他事情取决于该字段是否为空。我可能会考虑重新架构,但它不会。感谢您的意见。
  • 已经考虑过改变这一点,以便只有字母序列受此影响,实际上在某些地方有 JIRA 票,但我不擅长搜索,但是的,这是关于“陷阱”之一不幸地从 SQL 迁移到 MongoDB :(

标签: javascript node.js mongodb sorting mongoose


【解决方案1】:

这是日期类型的解决方法,每个此类日期字段需要 1 个附加字段进行排序(此解决方案也可用于数字)

  1. 在这个新字段中存储非空日期(或数字的 -ve)的负历元

  2. 按日期升序排序意味着按此-ve epoch 降序排序。 Nulls 将在最后,因为这是 MongoDB 按降序对数据进行排序的方式。实际日期(或数字)字段将按升序显示,末尾为空。

  3. 如果在按降序对日期(或数字)进行排序时需要空值,请按原始日期(或数字)字段而不是 -ve epoch 进行排序。

【讨论】:

    【解决方案2】:

    没有内置的方法可以做到这一点。已开通工单,让助手可以进行自定义排序功能,已计划但未计划:https://jira.mongodb.org/browse/SERVER-153

    查看这个帖子:Is there a way to put all the nil value at the end when sorting with mongodb/mongoid?

    问候, 莫西

    【讨论】:

      猜你喜欢
      • 2016-07-26
      • 2017-03-07
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      相关资源
      最近更新 更多