将MongoDB中的日期存储为ISODate()与存储为常规UNIX时间戳,是否有任何优势(性能,索引,大小等)?
答案 0 :(得分:22)
与time_t相比,ISODate的开销量与前者的优势相比是微不足道的。
ISO 8601格式日期是人类可读的,它可用于表示1970年1月1日之前的日期,最重要的是,它不是Y2038 problem的牺牲品。
这最后一点不够强调。 1960年,在一个世纪的数字上浪费一个或两个八位字节可能会带来任何好处,因为本世纪的转折是不可能的,这似乎是荒谬的。我们知道如何wrong that turned out to be。 2038年将比您预期的更快,而time_t已经不足以代表 - 例如 - 30年合约的付款时间表。
答案 1 :(得分:18)
MongoDB的内置Date类型与time_t中存储的unix时间戳非常相似。唯一的区别是日期是自1970年1月1日以来存储毫秒的64位字段,而不是自同一纪元以来存储秒数的32位字段。唯一的缺点是,对于当前版本,它将计数视为无符号,因此无法正确处理1970年之前的日期。这将在计划在一个月内发布的MongoDB 2.0中修复。
一个可能的混淆点是名称“ISODate”。它只是shell中的一个辅助函数来包装javascript的可怕Date构造函数。如果您调用“ISODate()”或“new Date()”,您将返回完全相同的Date对象,我们只是更改了它的打印方式。您可以在不使用我们的构造函数的情况下自由使用正常的ISO Date stings或time_t ints,但是您将无法使用您选择的语言获得更好的Date对象。