DateTime 对象和 YYYY-MM-DD 字符串之间的 MongoDB 区别

Sai*_*Sai 2 string perl datetime mongodb

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

Wir*_*rie 5

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

但是,如果您以后想要进行日期数学运算或将聚合框架与您的日期字段一起使用,则该字段实际上是一种Date类型是必要的:

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

例如,您可以$dayOfWeekDate类型字段上使用该函数。

您可能可以通过在 MongoDB 中使用$substr( doc )来执行一些简单的操作,例如 group on year ,但生成的代码不会那么清晰(也不太可能执行得很好)。

虽然这不是一个巨大的差异,但我建议Date如果可能的话,一般将它们存储为类型。

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

如果空间有问题,请删除不必要的字符(例如-):

20130613 -> 
    4 bytes for length of string 
    8 bytes encoded as UTF-8
    NULL character
Run Code Online (Sandbox Code Playgroud)

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

(我强烈建议您进行一些性能测试,以确定Date在带有 Perl 的 MongoDB中使用类型的性能影响是否会影响您的典型工作流程。)