我似乎不能得到甚至是最基本的日期查询工作在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连接器。
我使用robomongo作为mongodb客户端gui,下面为我工作
db.collectionName.find({"columnWithDateTime" : {
$lt:new ISODate("2016-02-28T00:00:00.000Z")}})
On the app side I am using nodejs based driver mongodb(v1.4.3),the application uses datepicker in the ui which gives date like YYYY-mm-dd, this is then appended with default time like 00:00:00 and then given to the new Date() constructor and then supplied to the mongodb criteria object,I think the driver converts the date to ISO date and the query then works and gives desired output, however the same new Date() constructor does not work or show same output on robo mongo,for the same criteria,which is weird,since I used robomongo to cross check my criteria objects.
而默认的cli mongoshell与ISODate和new Date()都能很好地工作
这是我的文档
"_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
这对我很管用。
老问题,但仍然是第一个谷歌击中,所以我张贴在这里,所以我发现它再次更容易…
使用Mongo 4.2和一个aggregate():
db.collection.aggregate(
[
{ $match: { "end_time": { "$gt": ISODate("2020-01-01T00:00:00.000Z") } } },
{ $project: {
"end_day": { $dateFromParts: { 'year' : {$year:"$end_time"}, 'month' : {$month:"$end_time"}, 'day': {$dayOfMonth:"$end_time"}, 'hour' : 0 } }
}},
{$group:{
_id: "$end_day",
"count":{$sum:1},
}}
]
)
这个函数将groupby变量作为日期,有时更好的方法是将其作为组件本身。