如何使用mongoose仅保存日期部分,而不是以ISODate格式保存?

6
如何使用mongoose schema仅保存日期部分。目前我的模型如下: myDate: { type: Date} 即使我只传递"2016-02-27",它也会将日期保存为"2016-02-27T00:00:00.000Z"

1
为什么更喜欢使用2016-02-27而不是2016-02-27T00:00:00.000Z - Anand S
好的,我只需要日期,例如预订日期,如果可能的话,它可以节省一些空间将其转换为仅日期格式。 - Saurabh
2个回答

5

我正在使用:

dateOfBirth: { type: Object }

并且像这样节省:

dateOfBirth: {year: 1988, month: 0, day: 8}

这让我得到:

  1. ability to search by year, month

  2. ability to make date object:

    const dateOfBirth = new Date(
      user.dateOfBirth.year, 
      user.dateOfBirth.month, 
      user.dateOfBirth.day
    );
    

这种方法可以避免时区变化,因为日期对象将在设备环境中创建。


更新

P.S. 我没有写出利弊,因为我的答案是关于分别存储日期的替代方式,当使用此方法时应该是显而易见的。

在与下面评论中的SergiiStotskyi聊天后,我决定列出利弊以警告开发人员选择最佳解决方案。

请记住,这种方法有非常少的好处。

优点(我只找到两个):

  1. 分离的年、月、日字段有助于按确切的年、月、日进行过滤。例如:查找所有五月份按年分组的记录(以比较前几年的月份差异)。
  2. 与敏感于时区的日期相比,年、月、日不会因时区而变化
  3. 不完全是好处,如果每个元素日期也是分开的,则可以将日期保存为来自客户端的日期

缺点:

  1. 如果需要按年龄获取记录,将很难确定,需要使用年字段使用的近似值(在我的用例中最适合,因为没有人关心项目中的确切数字)
  2. 对于确切的年龄筛选,将需要通过匹配年份并通过过滤掉范围外的项来减少聚合
  3. 需要验证闰年

你怎样用这种格式按年龄过滤人?这简直是个噩梦。 - Sergii Stotskyi
@SergiiStotskyi 在mongoose中,我已经使用年份字段进行了过滤。还有谁说需要年龄过滤的要求?我知道这不是精确的年龄过滤,但在我的项目中,没有人说它必须是精确的。无论如何,可以使用mongodb提供的聚合管道来完成。聚合的第一步将匹配年份,然后缩小范围的步骤将删除超出范围的部分。由于我们在编程中使用坚实的方法论,因此我们可以将聚合抽象化到一个自负责的方法中。 - num8er
@SergiiStotskyi 一切都取决于使用情况。如果数字是成千上万的,谁会在意数字呢?这意味着没有人拒绝近似的想法。 - num8er
@SergiiStotskyi 我的方法论可以帮助筛选出仅按年份或年月等进行筛选,因此它并不专门用于精确年龄筛选。但是,可以使用两个步骤的聚合来完成这项任务。 - num8er
我认为这个解决方案增加了更多的复杂性。首先,它是一个子文档,需要考虑闰年的月份和天数的验证。其次,它变得更难搜索,需要自定义逻辑或依赖近似值(正如你所说)。第三,我感到痛苦的是,重写这样的解决方案,因为之前的开发人员只是按照你建议的方式进行,没有考虑任何其他后果。第四,它需要复合索引才能在日期字段上进行搜索。因此,在你的回答中可能有必要添加这种决定的后果。 - Sergii Stotskyi
@SergiiStotskyi,这不是子文档,而是对象。是的,它用于近似值。但我并不觉得在社交网络中编写年龄过滤的聚合很痛苦。是的,我确实使用索引。请随意补充我的答案并成为共同作者,定义优缺点。 - num8er

3
在幕后,Mongoose日期就像JavaScript中的日期一样:它存储小时、秒等等。与SQL不同,没有日期/时间的区别。只是显示的问题。原因是Mongo不支持这种类型。您可以创建具有年/月/日属性的对象,但是处理起来很麻烦。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接