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


189

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

谢谢!

Answers:


312

尽管它$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指出)。

根据mongo Shell中的数据类型,两者应等效:

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

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

并且using ISODate 应该仍然返回Date对象

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


3
是的 我认为,当您Query在Spring中打印出对象时,返回的结果使我不满意。查询的序列化形式不一定是有效的查询,您只需将其复制/粘贴到mongo shell中,这本身就很令人沮丧。罪魁祸首是在这里:grepcode.com/file/repo1.maven.org/maven2/org.mongodb/...
贾森礼让

2
比较部分(无时间)日期时,我不得不从切换new Date('2016-03-09')ISODate('2016-03-09')。前者将返回过去的日期以进行$gte查询。
马特·莫纳

@MattMolnar注意,并使用属性更新了答案。谢谢。
zero323 '16

92

MongoDB食谱页面评论:

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

这对我有用。在完整上下文中,以下命令将获取每个记录,其中dtdate字段的日期为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") }})

1
我收到“ ISODate未定义”错误。我无法解决这个问题。
Batuhan Akkaya

@BatuhanAkkaya在带有pymongo的python中,datetime.datetime等效于ISODate
jtbr

12

试试这个:

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

5

我正在使用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来交叉检查我的条件对象。

而默认的cli mongoshell可以同时ISODatenew Date()


1
谢谢您的提示,Robomongo比Mongo Compass更好
Alex Alex

5

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

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

在mlab.com上定义我的搜索查询的唯一方法。


运行查询时出错。原因:(invalid_operator)无效的运算符:$ date
saber tabatabaee yazdi

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 ) }
    } )

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


4
欢迎使用Stack Overflow!请仅发布问题的答案,而不要添加诸如“这是我的第一篇文章”之类的多余内容。将Stack Overflow视为Wikipedia,而不是留言板。
durron597

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号日期document.so,我用了这个...。

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

result:1

这对我有用。


0

这对于我寻找小于或等于现在的价值时是有用的:

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


0

老问题了,但还是第一个被谷歌打中的,所以我在这里发布它,这样我就更容易找到它了...

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.