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