Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有日期比较的MongoDB查找查询_Java_Mongodb_Mongodb Java - Fatal编程技术网

Java 具有日期比较的MongoDB查找查询

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

在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.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有其他选择吗?给出的答案应该能解决你的问题。我在评论中解释了为什么会这样。你的意思是我在集合中插入文档时必须更改格式,根据你的说法,如果将日期作为字符串插入,则无法比较日期。对吧?我会建议的。本质上,您正在做所有繁重的工作,转换和解析内嵌代码中的字符串。这包括进行时区转换等。你也在为将来可能在服务器端完成的任何日期计算射击自己的脚。另一种选择是让你的字符串格式和时区与结果保持同步,所有事情都会按照词汇顺序进行,而且没有人会做不同的事情。现在有些痛苦是为了解决未来的痛苦。