在mongodb中存储日期的有效方法是什么?

时间:2012-11-20 06:15:52

标签: java mongodb

我有一个包含40k文档的JSON文件,每个文档都包含一个日期字段。我需要在Java中查询日期以检索数据,因此我将日期存储为numberLong格式。

Date dt = new Date();
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
dt = format.parse(nextLine[j]);
document.put(ColumnNameAsKey[j], dt.getTime());

上面的代码在API中进行for循环以将数据存储到mongo。 但是在输入所有这些数据之后,当我在同一天自动查询numberlong更改时,我无法检索所需日期的所有数据。我要检索的查询是

querygraph.put("Complaint Date (MM/DD/YYYY)", new 
    BasicDBObject("$gte",startdate.getTime()).append("$lte",EndDate.getTime()));

例如:如果日期08/01/2012包含大量文档,则在mongo的日期字段中替换08/01/2012日期的正确数字龙。这将继续,但是在一些文件的数量之后,数字仍在继续改变..即如果NumberLong是日期08/01/2012的134353300000,那么在6或更多文件之后,数字龙将与前一个不同..造成无法检索日期08/01/2012的确切数据.. 是什么让这里有所不同?

1 个答案:

答案 0 :(得分:1)

认为会看到你的问题,因为你存储了毫秒精确的时间,你实际上遇到了长时间整数的问题,这些问题代表了一天的部分时间,因此无法查询过去,例如午夜。 / p>

这是因为MongoDB查询不会考虑这种上下文查询。

首先提示,不要存储为数字长,只使用行存储为$date BSON类型:

Date dt = new Date();
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");

您将从使用指定的BSON日期类型获得更多功能,并且查询能力全面相同。

您对查询记录有正确的想法:

querygraph.put("Complaint Date (MM/DD/YYYY)", new 
    BasicDBObject("$gte",startdate.getTime()).append("$lte",EndDate.getTime())); 

但我觉得你做错了什么。当您创建开始日期和结束日期时,您实际上正在查找开始日期的00:00:00时间和结束日期的23:59:59时间。这是由于您的getTime()函数,UNIX时间戳不会返回部分时间,因此它只返回默认值now()

可以让您的生活更轻松的一种方法是在此字段上标准化时间,以便为所有日期指定00:00:00的时间,以便您正确选择范围。