我似乎无法让最基本的日期查询在 MongoDB 中工作。使用如下所示的文档:
{ "_id" : "foobar/201310", "ap" : "foobar", "dt" : ISODate("2013-10-01T00:00:00.000Z"), "tl" : 375439 }
一个看起来像这样的查询:
{ "dt" : { "$gte" : { "$date" : "2013-10-01T00:00:00.000Z" } } }
我从执行中得到 0 个结果:
db.mycollection.find({ "dt" : { "$gte" : { "$date" : "2013-10-01T00:00:00.000Z"}} })
知道为什么这不起作用吗?
作为参考,这个查询是由Spring 的 MongoTemplate生成的,所以我无法直接控制最终发送到 MongoDB 的查询。
(附注)
> db.version() 2.4.7
谢谢!
虽然$date它是MongoDB 扩展 JSON的一部分,并且这是您默认使用的mongoexport,但我认为您不能真正将它用作查询的一部分。
$date
mongoexport
如果尝试使用以下方式进行精确搜索$date:
db.foo.find({dt: {"$date": "2012-01-01T15:00:00.000Z"}})
你会得到错误:
error: { "$err" : "invalid operator: $date", "code" : 10068 }
尝试这个:
db.mycollection.find({ "dt" : {"$gte": new Date("2013-10-01T00:00:00.000Z")} })
或(在发表评论之后):
db.mycollection.find({ "dt" : {"$gte": ISODate("2013-10-01T00:00:00.000Z")} })
ISODate可能还需要比较没有时间的日期(@MattMolnar指出)。
ISODate
根据mongo Shell 中的数据类型,两者都应该是等价的:
mongo shell 提供了多种方法来返回日期,无论是作为字符串还是作为 Date 对象: Date() 方法,将当前日期作为字符串返回。 new Date() 构造函数,它使用 ISODate() 包装器返回 Date 对象。 ISODate() 构造函数,它使用 ISODate() 包装器返回 Date 对象。
mongo shell 提供了多种方法来返回日期,无论是作为字符串还是作为 Date 对象:
并且 usingISODate 仍然应该返回一个 Date 对象。
{"$date": "ISO-8601 string"}当需要严格的 JSON 表示时可以使用。一个可能的例子是 Hadoop 连接器。
{"$date": "ISO-8601 string"}