2014-02-06 37 views
0

在mongodb集合中,我将日期保存为一个字符串。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。 这段代码有什么问题?

+0

给出的答案应该可以解决您的问题。我在评论中增加了一个解释,为什么如此。 –

回答

0

更新日期比较的代码如下:

DBObject dateQuery = BasicDBObjectBuilder.start("$gte", yest).add("$lte", now).get(); 
find.put("deliveryTime", dateQuery); 
+0

解释这个反应。您实际上想要传递Date对象(如图所示进行修改),而不是字符串。在mongo shell中,日期可能看起来像字符串,但它们实际上是内部来自* epoch *时间的数字。驱动程序正在为您正确处理转换。 –

+0

@NeilLunn完成更改,仍然计数0 – Sidd

+0

@Sidd,而我打开一个IDE。你可以在mongo shell中测试你的查询,并用你期望看到它返回任何值的值。还要检查你的System.out调试是否给你预期的日期。 –

0
从对话链的问题是,集合中的文件居然有在 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"}} 
+0

你的意思是当我在集合中插入文档时,我必须改变格式,并且根据你没有办法比较日期如果它被插入为一个字符串。对 ? – Sidd

+0

它会被建议。本质上,你正在做所有繁重的工作,在你的内联代码中转换和解析字符串。这包括做时区转换等等。你也在拍摄自己的脚,以便在将来可以在服务器端完成任何日期数学。另一种方法是让你的字符串格式和时区与结果同步,一切都按照词汇顺序**总是**,而且没有人会做不同的事情。现在解决未来痛苦的一些痛苦。 –