我似乎不能得到甚至是最基本的日期查询工作在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,如下所示:
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")}
})
或者(以下是@user3805045的评论):
db.mycollection.find({
"dt" : {"$gte": ISODate("2013-10-01T00:00:00.000Z")}
})
也可能需要ISODate来比较没有时间的日期(由@MattMolnar指出)。
根据mongo Shell中的数据类型,两者应该是等效的:
mongo shell提供了各种方法来返回日期,可以是字符串,也可以是date对象:
Date()方法,该方法以字符串形式返回当前日期。
新的Date()构造函数,它使用ISODate()包装器返回一个Date对象。
构造函数,它使用ISODate()包装器返回一个Date对象。
并且使用ISODate仍然应该返回一个Date对象。
{"$date": "ISO-8601 string"}可以在需要严格的JSON表示时使用。一个可能的例子是Hadoop连接器。
这是我的文档
"_id" : ObjectId("590173023c488e9a48e903d6"),
"updatedAt" : ISODate("2017-04-27T04:26:42.709Z"),
"createdAt" : ISODate("2017-04-27T04:26:42.709Z"),
"flightId" : "590170f97cb84116075e2680",
"_id" : ObjectId("590173023c488e9a48e903d6"),
"updatedAt" : ISODate("2017-04-28T03:26:42.609Z"),
"createdAt" : ISODate("2017-04-28T03:26:42.609Z"),
"flightId" : "590170f97cb84116075e2680",
现在我想找到每一个27号日期的文档。所以我用了这个....
> db.users.find({createdAt:{"$gte":ISODate("2017-04-27T00:00:00Z"),"$lt":ISODate("2017-04-28T00:00:00Z") }}).count()
result:1
这对我很管用。