在 MongoDB 中,我只需要进行日期范围查询。但是数据集很大(9 M)并且将字符串转换为 DateTime 对象(我使用 Perl 脚本)然后将它们插入 MongoDB 非常耗时。如果我只是将日期存储为字符串“YYYY-MM-DD”,范围查询 gt:"2013-06-01" 和 lt:"2013-08-31" 是否仍然会给我与它们相同的结果日期时间类型?在这种情况下它们是否相同?如果是这样,存储为 DateTime 对象有什么好处。谢谢。
2 回答
如果您不关心应用程序中的时区支持,那么在 MongoDB 中使用字符串进行基本查询应该可以正常工作(但如果确实重要,您将需要一个真实Date
类型)。
但是,如果您稍后想要进行日期数学运算或将聚合框架与您的日期字段一起使用,则该字段实际上是一个Date
类型是必要的:
http://docs.mongodb.org/manual/reference/aggregation/#date-operators
例如,您可以在键入的字段上使用该$dayOfWeek
函数。Date
您可以通过在 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
函数也是如此)。
(我强烈建议您进行一些性能测试,以确定Date
在 MongoDB 中使用 Perl 类型的性能影响是否会影响您的典型工作流程。)
DateTime 的优点是在磁盘上少了几个字节。bson 将 DateTime 存储为整数,但“2013-08-31”是一个字符串,在 20 字节处。
ISO-8601 ( http://www.w3.org/QA/Tips/iso-date ) 是为了能够快速排序。
在这种情况下,我将始终存储为日期时间。
编辑:你看到这个字符串到日期时间的转换有多耗时?你确定这是你的瓶颈吗?我很难相信转换需要你声称的时间。