Java 具有日期比较的MongoDB查找查询
在mongodb集合中,我将日期保存为字符串 我想取过去24小时内插入的文件。下面是我的代码-Java 具有日期比较的MongoDB查找查询,java,mongodb,mongodb-java,Java,Mongodb,Mongodb Java,在mongodb集合中,我将日期保存为字符串 我想取过去24小时内插入的文件。下面是我的代码- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date yest = new Date(); Date now = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(now); cal.ad
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date yest = new Date();
Date now = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(now);
cal.add(Calendar.MINUTE, -1440);
yest = cal.getTime();
String dToN = sdf.format(now);
String dToY = sdf.format(yest);
System.out.println("Yest:"+dToY);
System.out.println("Now:"+dToN)
BasicDBObject find = new BasicDBObject("retryCount", new BasicDBObject("$gt", 0));
find.append("status",1);
find.append("deliveryTime",new BasicDBObject("$gte", dToY));
find.append("deliveryTime",new BasicDBObject("$lte", dToN));
cursor = coll.find(find);
int misCount = cursor.count();
但是我的日期比较代码不起作用。每次我都会得到计数0。
此代码有什么问题?更新日期比较代码,如下所示:
DBObject dateQuery = BasicDBObjectBuilder.start("$gte", yest).add("$lte", now).get();
find.put("deliveryTime", dateQuery);
因此,从会话链来看,问题在于集合中的文档实际上在
deliveryTime
字段中有字符串。如果插入和更新中的代码进行了类似的转换,则可能会在许多地方出现这种情况。此外,内部格式为UTC,这可能不是字符串的格式。司机是来帮你处理这件事的
建议您在收藏中转换日期,并将所有区域视为字符串进行书写或阅读
以下内容将说明如何使用日期对象以及它们将如何序列化:
Date now = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(now);
cal.add(Calendar.DAY_OF_MONTH, -1);
Date yest = cal.getTime();
BasicDBObject timeNow = new BasicDBObject("now", now );
BasicDBObject timeThen = new BasicDBObject("then" yest)
System.out.println( timeNow );
System.out.println( timeThen );
注意:尽管输出显示如下。它仍然没有传递字符串,而是在BSON时间戳类型上传递一个时间戳
{ "this" : { "$date" : "2014-02-06T10:50:05.873Z"}}
来解释这个反应。实际上,您希望传入日期对象(如图所示进行修改),而不是字符串。在mongo shell中,日期可能看起来像字符串,但实际上它们在内部是纪元时间的数字。驱动程序正在为您正确地处理转换。@Sidd,我打开一个IDE。您能否在mongo shell中使用期望的值测试您的查询,看看它是否返回任何内容。还要检查System.out调试是否提供了您期望的日期。@NeilLunn我从umongo发出此查询-{“deliveryTime”:{“$gte”:“2014-02-05 14:58:36”,“$lte”:“2014-02-06 14:58:36”},“retryCount”:{“$gt”:0},“status”:1},并获得97次计数。那些是弦。这是你的问题。@NeilLunn有其他选择吗?给出的答案应该能解决你的问题。我在评论中解释了为什么会这样。你的意思是我在集合中插入文档时必须更改格式,根据你的说法,如果将日期作为字符串插入,则无法比较日期。对吧?我会建议的。本质上,您正在做所有繁重的工作,转换和解析内嵌代码中的字符串。这包括进行时区转换等。你也在为将来可能在服务器端完成的任何日期计算射击自己的脚。另一种选择是让你的字符串格式和时区与结果保持同步,所有事情都会按照词汇顺序进行,而且没有人会做不同的事情。现在有些痛苦是为了解决未来的痛苦。