我正在尝试比较以下集合中的日期
使用$ db.notifications.find(){“_ id”: ObjectId(“51a4467be4b0142fc8b80eda”),“time”:“Tue May 28 11:24:03 IST 2013“,”KEY“:”VALUE1“} {”_ id“: ObjectId(“51a4467be4b0142fc8b80edb”),“time”:“Tue May 28 11:24:03 IST 2013“,”KEY“:”VALUE2“}
$ db.notifications.find({“time”:{“$ gt”:“Fri May 31 00:00:00 IST 2013" }})
但我观察到的是它将“时间”视为比较 字符串不是日期,因此第二个命令返回我 条目。
$ db.notifications.find({“time”:{“$ gt”:“Fri May 31 00:00:00 IST 2013“}}){”_ id“:ObjectId(”51a4467be4b0142fc8b80eda“),”time“:”Tue“ 5月28日11:24:03 IST 2013“,”KEY“:”VALUE1“} {”_ id“: ObjectId(“51a4467be4b0142fc8b80edb”),“time”:“Tue May 28 11:24:03 IST 2013“,”KEY“:”VALUE2“}
您能否帮我解决正确的问题,并让我知道如何 正确的版本可以用JAVA编写。
非常感谢!!
EDIT1:
我使用以下代码保存日期
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
dateFormat.setLenient(false);
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
String nowString = dateFormat.format(new Date());
Date nowDate = dateFormat.parse(nowString);
input.put("formattedDate", nowDate);
DBCollection collection = db.getCollection(<collection name>);
DBObject dbObject = (DBObject) JSON.parse(input.toString());
collection.insert(dbObject);"
并使用
查询DBObject query = QueryBuilder.start().put("formattedDate")
.greaterThan(prevDate).get();
DBCursor cursorDocJSON = collection.find(query);
我看到我将“时间”保存为仅日期。为什么还有问题?
答案 0 :(得分:1)
看起来您的日期存储为字符串而不是ISODate。如果它存储为真实日期而不是字符串,您会看到类似的内容:
> db.MyCollection.find()
{ "_id" : ObjectId("51a4e4aa3004bc68e4f499e5"), "date" : ISODate("2000-09-29T23:00:00Z") }
确保在保存“时间”字段时将其作为日期插入。如果您使用Java驱动程序插入值,则需要确保将时间字段添加到DBObject时是一个java.util.Date(假设您直接使用Java驱动程序而不是某些第三方库) )。
当您将其作为日期插入时,您应该能够使用shell中的ISODate值或通过Java驱动程序使用日期来执行所需的查询类型。
答案 1 :(得分:0)
我认为你的日期应该是一个ISODate对象。目前它是您查询中的一个字符串。尝试类似下面的内容。
db.coll.find({"time" : { $gte : new ISODate("2013-05-28T20:18:00Z") }});
此外,related link