5

这是我第一次使用带有 java 驱动程序的 Mongodb。我可以使用 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"}}}}

PS如果不是很明显,我正在尝试查找上个月内的所有记录。

4

4 回答 4

16

好像您正在构建错误的查询。请尝试以下方法:

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

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

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

https://github.com/jmkgreen/morphia

于 2013-01-03T14:28:27.620 回答
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()方法。

于 2012-12-06T21:29:20.397 回答
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}}

其中 start 和 end 是日期。似乎您第二次引用“created_on”是不必要的,实际上可能会破坏您的查询。

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

于 2012-12-13T23:28:22.840 回答
1

Jodatime 库非常有用,请使用 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());
    }
于 2014-11-25T13:32:22.993 回答