MongoDB:我应该使用字符串代替日期吗?

9
在使用Angular、Node和MongoDB的JSON格式进行web项目开发时,日期并不被JSON序列化器原生支持。这个问题有一个解决方法,就像 这里所示。但是,我不明白在MongoDB中将日期保存为日期对象而不是字符串的好处是什么?因为我还没有深入研究该项目,所以看不出区别。

1
Angular是基于Node.js的,因此它应该使用MongoDB Node.js驱动程序,该驱动程序将ISODate序列化为JavaScript的等效形式。 - Sammaye
1
@Sammaye 嗯... Angular 不是 Node.js。打错了吗? - Kevin B
@KevinB,那为什么它有一个Node.js的安装指南:https://docs.angularjs.org/tutorial? - Sammaye
@KevinB 但它是从npm运行开发服务器的吗? - Sammaye
@Sammaye 我正在使用 MongoDB 的 Node.js 驱动程序,它将日期转换为字符串。请参阅我的另一个问题 http://stackoverflow.com/questions/29505968/how-to-keep-date-from-client-saved-in-mongodb-as-date - newman
2个回答

16
通过将日期保存为字符串而不是日期,会错过一些非常有用的功能:
  1. MongoDB可以使用$gt$lt查询日期范围。
  2. 在版本3.0中,聚合框架引入了许多有用的日期处理聚合运算符。这些都不能用于字符串,也只有少数可以被适当的字符串操作替代。
  3. MongoDB内部处理日期采用UNIX epoch,因此不用担心从不同时区或夏令时中保存时间戳等恶心细节问题。
  4. BSON日期只有8个字节大小。以最小形式的YYYYMMDD的日期占用12个字节(BSON中的字符串前缀带有4个字节的整数长度)。当你将其存储为使用ISO 8601标准提供的所有内容(日期、精确到毫秒的时间和时区)的ISODate字符串时,它需要32个字节 - 是存储空间的四倍。
您需要了解这些信息是否与您的项目相关。
如果您真的想避免使用BSON日期类型,则应考虑将日期存储为表示自固定时间点以来经过的毫秒数/秒数/小时数/天数(适用于您的用例)的数字,而不是字符串。这样,您将保留所有优点,但排除第2点的影响。

4

如果您选择这种方法,至少应使用ISO日期。然而,我认为将日期值存储为日期对象具有优势。将日期存储为日期对象将允许您添加索引,并且应该有助于处理日期范围查询。尽管如此,许多开发人员似乎很乐意将日期存储为字符串,请参见MongoDB中存储日期的最佳方法是什么?


如果我能强制在应用程序中使用ISODate风格的字符串,这样可以吗? - newman

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