0

我正在尝试比较以下集合中的日期

$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" : " 5 月 28 日星期二 11:24:03 IST 2013","KEY":"VALUE1"} {"_id":ObjectId("51a4467be4b0142fc8b80edb"),"time":"5 月 28 日星期二 11:24:03 IST 2013","键”:“值 2”}

你能帮我正确的查询,还让我知道如何用 JAVA 编写正确的版本。

非常感谢 !!

编辑1:

我正在使用以下代码保存日期

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);

我看到我只将“时间”保存为日期。为什么还是有问题?

4

2 回答 2

1

看起来您的日期存储为字符串而不是 ISODate。如果它存储为真实日期而不是字符串,您会看到如下内容:

> db.MyCollection.find()
{ "_id" : ObjectId("51a4e4aa3004bc68e4f499e5"), "date" : ISODate("2000-09-29T23:00:00Z") }

确保在保存“时间”字段时将其作为日期插入。如果您使用 Java 驱动程序插入值,则在将其添加到 DBObject 时需要确保时间字段是 java.util.Date(假设您直接使用 Java 驱动程序而不是某些第三方库)。

当您将其作为日期插入后,您应该能够使用 shell 中的 ISODate 值或通过 Java 驱动程序使用 Date 执行所需的查询类型。

于 2013-05-28T17:13:17.210 回答
0

我认为你的日期应该是一个 ISODate 对象。目前它在您的查询中是一个字符串。试试下面的东西。

db.coll.find({"time" : { $gte : new ISODate("2013-05-28T20:18:00Z") }});

还有相关链接

于 2013-05-28T15:49:31.290 回答