这是我第一次使用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。如果不是很明显,我试图找到上个月内的所有记录。
答案 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查询。
答案 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());
}