使用mongodb中的ISODate进行date查询似乎不起作用

我似乎甚至无法获得最基本的date查询在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的查询。

(PS)

 > db.version() 2.4.7 

谢谢!

尽pipe$date是MongoDB扩展JSON的一部分,这就是mongoexport默认值,我不认为你真的可以把它用作查询的一部分。

如果尝试使用如下所示的$date精确search:

 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可能也需要比较date没有时间(由@MattMolnarlogging )。

根据mongo Shell中的数据types,两者应该是等价的:

mongo shell提供了各种返回date的方法,可以是string,也可以是Date对象:

  • Date()方法以stringforms返回当前date。
  • 新的Date()构造函数,它使用ISODate()包装函数返回一个Date对象。
  • ISODate()构造函数,它使用ISODate()包装函数返回一个Date对象。

并且使用ISODate 应该仍然返回一个Date对象 。

当需要严格的JSON表示时,可以使用{"$date": "ISO-8601 string"} 。 一个可能的例子是Hadoop连接器。

从MongoDB食谱页面评论:

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

这对我有效。 在完整的上下文中,下面的命令获取每个logging的date字段2013-10-01(YYYY-MM-DD)祖鲁语:

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

尝试这个:

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

在json严格模式下,您必须保持顺序:

 { "dt": { "$gte": { "$date": "2013-10-01T00:00:00.000Z" } } } 

唯一的工作是在mlab.com上定义我的search查询。

我正在使用robomongo作为mongodb客户端,下面的工作为我

 db.collectionName.find({"columnWithDateTime" : { $lt:new ISODate("2016-02-28T00:00:00.000Z")}}) 

在应用程序方面,我使用的是基于nodejs的驱动程序mongodb(v1.4.3),应用程序在ui中使用datepicker,它给出了像YYYY-mm-dd这样的date,然后附加默认的时间如00:00:00,然后给定到new Date()构造函数,然后提供给mongodb标准对象,我认为驱动程序将date转换为ISOdate和查询然后工作,并提供所需的输出,但是相同的new Date()构造函数不起作用或显示相同在robo mongo输出,相同的标准,这是奇怪的,因为我用robomongo交叉检查我的标准对象。

而默认的cli mongoshell与ISODatenew Date()

在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”字段大于给定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", 

现在我想find每个27号datedocument.so我用这个….

  > db.users.find({createdAt:{"$gte":ISODate("2017-04-27T00:00:00Z"),"$lt":ISODate("2017-04-28T00:00:00Z") }}).count() result:1 

这对我工作。