Mongodb + Java驱动程序。按日期范围搜索

时间:2012-12-06 21:10:24

标签: java mongodb date

这是我第一次使用Mongodb和java驱动程序。我可以使用javascript和Date()对象通过命令行查询数据库,但是,我在使用驱动程序时遇到问题。根据我的查询,任何人都可以看到问题是什么?感谢

            Date current = new Date();
            DBCollection coll = db.getCollection("messages");

            BasicDBObject query = new BasicDBObject("created_on", new BasicDBObject("$gte", new Date(current.getYear(), current.getMonth(), current.getDate())).
                    append("created_on", new BasicDBObject("$lt", new Date(current.getYear(), current.getMonth() - 1, current.getDate()))));

            System.out.println("Query: " + query);


            DBCursor cursor = coll.find(query);
  

查询:{“created_on”:{“$ gte”:{“$ date”:   “2012-12-06T05:00:00.000Z”},“created_on”:{“$ lt”:{“$ date”:   “2012-11-06T05:00:00.000Z”}}}}

P.S。如果不是很明显,我试图找到上个月内的所有记录。

4 个答案:

答案 0 :(得分:15)

好像你正在构建错误的查询。请尝试下面的一个:

BasicDBObject query = new BasicDBObject("created_on", //
                      new BasicDBObject("$gte", new DateTime().toDate()).append("$lt", new DateTime().toDate()));

Datetime object是一个简化java中日期操作的库。你可以检查一下。 http://joda-time.sourceforge.net/

此外,morphia是一个很好的java对象 - 文档映射器(ODM)框架,用于通过java驱动程序使用mongodb。它简化了通过java查询。

https://github.com/jmkgreen/morphia

答案 1 :(得分:3)

根据输出的查询,您正在查找包含字段created_on的文档,该字段还有一个名为created_on的子项。我假设不存在这样的文件。换句话说,您的查询未正确形成。

您的查询对象应如下所示:

BasicDBObject dateRange = new BasicDBObject ("$gte", new Date(current.getYear(), current.getMonth(), current.getDate());
dateRange.put("$lt", new Date(current.getYear(), current.getMonth() - 1, current.getDate());

BasicDBObject query = new BasicDBObject("created_on", dateRange);

另外,作为侧边栏,您可能应该避免使用java.util.Date类的三参数构造函数,因为它已被弃用。在MongoDB Java驱动程序中使用日期时,我通常使用java.util.Calendar类及其getTime()方法。

答案 2 :(得分:1)

之前我没有使用过mongo的Java驱动程序,但似乎你创建的查询不正确。

Query: { "created_on" : { "$gte" : { "$date" : "2012-12-06T05:00:00.000Z"} , "created_on" : { "$lt" : { "$date" : "2012-11-06T05:00:00.000Z"}}}}

查询实际上应该看起来像:

Query: { "created_on" : {$gte: start, $lt: end}}

开始和结束日期。似乎第二次引用“created_on”是不必要的,实际上可能会破坏您的查询。

注意:我没有机会测试这个理论,但我正在http://cookbook.mongodb.org/patterns/date_range/工作,这似乎与手头的问题非常相关。

答案 3 :(得分:1)

Jodatime lib非常有用,请使用DateTimeZone.UTC作为DateTime的时区参数。设置时区后,您将获得准确的结果。试试这个

    Calendar cal = Calendar.getInstance();
    //get current year,month & day using Calender
    int year=cal.get(Calendar.YEAR);
    int monthNumber=cal.get(Calendar.MONTH);
    int dateNumber=cal.get(Calendar.DAY_OF_MONTH);
    monthNumber+=1;


    BasicDBObject query = new BasicDBObject("dateCreated",new BasicDBObject("$gte", new DateTime(year, monthNumber, dateNumber, 0, 0,DateTimeZone.UTC).toDate()).append("$lte",new DateTime(year, monthNumber, dateNumber, 23, 59,DateTimeZone.UTC).toDate()));

    System.out.println("formed query: "+query);

    DBCursor cursor = collection.find(query);
    while(cursor.hasNext())
    {
        System.out.println("found doc in given time range: "+cursor.next().toString());
    }