在mongodb中使用ISODate进行日期查询似乎不起作用

时间:2013-11-06 18:28:45

标签: json mongodb bson isodate

我似乎无法在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's MongoTemplate生成,因此我无法直接控制最终发送到MongoDB的查询。

(P.S。)

> db.version()
2.4.7

谢谢!

10 个答案:

答案 0 :(得分:256)

虽然$dateMongoDB Extended 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注明)。

根据Data Types in the mongo Shell,两者都应该是等价的:

  

mongo shell提供了各种方法来返回日期,可以是字符串,也可以是Date对象:

     
      
  • Date()方法,以字符串形式返回当前日期。
  •   
  • new Date()构造函数,它使用ISODate()包装器返回Date对象。
  •   
  • ISODate()构造函数,它使用ISODate()包装器返回Date对象。
  •   

并使用ISODate should still return a Date object

当需要严格的JSON表示时,可以使用

{"$date": "ISO-8601 string"}。一个可能的例子是Hadoop连接器。

答案 1 :(得分:86)

来自MongoDB cookbook页面评论:

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

这对我有用。在完整上下文中,以下命令获取dt日期字段在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") }})

答案 2 :(得分:11)

试试这个:

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

答案 3 :(得分:5)

在json严格模式下,您必须保留订单:

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

只能在mlab.com上定义我的搜索查询。

答案 4 :(得分:3)

我使用robomongo作为mongodb客户端gui,以下为我工作

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

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

默认cli mongoshell适用于ISODatenew Date()

答案 5 :(得分:2)

在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'字段大于给定日期的值

答案 6 :(得分:1)

这是我的文件

"_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

这对我有用。

答案 7 :(得分:1)

new Date()换行:

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

答案 8 :(得分:0)

这对于我搜索小于或等于现在的值时是有用的:

db.collectionName.find({ "dt": { "$lte" : new Date() + "" } });

答案 9 :(得分:0)

旧问题,但仍然是第一个被Google点击的问题,因此我将其发布在这里,这样我就更容易找到它了...

使用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变量作为日期,有时更好地用作组件本身。