MongoDB DateTime对象与YYYY-MM-DD字符串的差异



在MongoDB中,我只需要进行日期范围查询。但是数据集是巨大的(9 M)和转换字符串到DateTime对象(我使用Perl脚本),然后将它们插入到MongoDB是非常耗时的。如果我只是将日期存储为字符串"YYYY-MM-DD",那么范围查询gt:"2013-06-01"和lt:"2013-08-31"是否仍然会给我相同的结果,如果它们是日期时间类型?它们在这种情况下是相同的吗?如果是这样,那么将其存储为DateTime对象的优势是什么?谢谢。

如果你不关心你的应用程序中的时区支持,那么在MongoDB中使用字符串进行基本查询应该工作良好(但如果它确实重要,你会想要一个真正的Date类型)。

但是,如果您以后想要进行日期数学运算或对日期字段使用聚合框架,那么该字段实际上必须是Date类型:

http://docs.mongodb.org/manual/reference/aggregation/date-operators

例如,您可以在Date类型字段上使用$dayOfWeek函数。

你可能会做一些简单的事情,比如通过使用MongoDB中的$substr (doc)来分组,但结果代码不会那么清晰(也不太可能执行得那么好)。

虽然没有太大的区别,但如果可能的话,我建议将它们存储为Date类型。

我在Perl驱动程序的文档中看到开发人员被警告不要使用DateTime,因为它非常慢,所以如果你经常使用Perl,并且聚合框架不是一个大问题,你最好将它们存储为数字或字符串,并根据需要在Perl中转换它们。

如果空格是一个问题,删除不必要的字符(如-):

20130613 -> 
    4 bytes for length of string 
    8 bytes encoded as UTF-8
    NULL character

就是13个字符。另一方面,BSON/MongoDB中的DateTime值需要8个字节(Perl $time函数也是如此)。

(我强烈建议您做一些性能测试,以找出在MongoDB中使用Date类型是否会影响您的典型工作流。)

DateTime的优点是在磁盘上减少了几个字节。bson将DateTime存储为整数,但"2013-08-31"是一个字符串,在那里有20个字节。

ISO-8601 (http://www.w3.org/QA/Tips/iso-date)意味着能够快速排序。

在本例中,我将始终存储为datetime。

edit:查看这个字符串到日期时间的转换有多耗时?你确定这就是你的瓶颈吗?我很难相信转换会像你说的那么长。

最新更新