0

我有一个包含 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 不断变化.. 即如果 NumberLong 在 2012 年 8 月 1 日的日期为 134353300000,那么在 6 个或更多文档之后,numberlong 将与前一个不同.. 导致无法检索日期 08/01/2012 的准确数据。这里有什么不同?

4

1 回答 1

1

认为看到你的问题,因为你存储了毫秒的时间精度,你实际上遇到了代表一天中部分时间的长整数的问题,使得无法查询过去,比如午夜。

这是因为 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所有日期的时间,以便您正确选择范围。

于 2012-11-20T11:17:54.810 回答