我似乎不能得到甚至是最基本的日期查询工作在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

谢谢!


当前回答

在MongoDB shell中:

db.getCollection('sensorevents').find({from:{$gt: new ISODate('2015-08-30 16:50:24.481Z')}})

在我的nodeJS代码中(使用Mongoose)

    SensorEvent.Model.find( {
        from: { $gt: new Date( SensorEventListener.lastSeenSensorFrom ) }
    } )

我正在查询我的传感器事件集合,以返回'from'字段大于给定日期的值

其他回答

用new Date()将其包装:

{ "dt" : { "$lt" : new Date("2012-01-01T15:00:00.000Z") } }

来自MongoDB烹饪书页面的评论:

"dt" : 
{
    "$gte" : ISODate("2014-07-02T00:00:00Z"), 
    "$lt" : ISODate("2014-07-03T00:00:00Z") 
}

这对我很管用。在完整的上下文中,以下命令获取dt date字段的日期为2013-10-01 (YYYY-MM-DD) Zulu的每条记录:

db.mycollection.find({ "dt" : { "$gte" : ISODate("2013-10-01T00:00:00Z"), "$lt" : ISODate("2013-10-02T00:00:00Z") }})

虽然$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连接器。

试试这个:

{ "dt" : { "$gte" : ISODate("2013-10-01") } }

虽然我测试了AWS DocumentDB(应该是Mongo 4兼容的),但这对我来说工作得很好,没有使用Dateor ISODate:

db.collection_name.find({"an_iso_date_field": {$lte: "2021-02-04T03:42:00Z"}})