我有一个包含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将不同于前一个。无法检索2012年8月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
时间,从而可以正确选择范围。