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

Jas*_*tes 170 json mongodb bson isodate

我似乎无法在MongoDB中使用最基本的日期查询.使用看起来像这样的文档:

{
    "_id" : "foobar/201310",
    "ap" : "foobar",
    "dt" : ISODate("2013-10-01T00:00:00.000Z"),
    "tl" : 375439
}
Run Code Online (Sandbox Code Playgroud)

一个看起来像这样的查询:

{ 
    "dt" : { 
        "$gte" : { 
            "$date" : "2013-10-01T00:00:00.000Z"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我从执行中得到0结果:

db.mycollection.find({
  "dt" : { "$gte" : { "$date" : "2013-10-01T00:00:00.000Z"}}
})
Run Code Online (Sandbox Code Playgroud)

知道为什么这不起作用吗?

作为参考,此查询由Spring的MongoTemplate生成,因此我无法直接控制最终发送到MongoDB的查询.

(PS)

> db.version()
2.4.7
Run Code Online (Sandbox Code Playgroud)

谢谢!

zer*_*323 285

虽然它$dateMongoDB Extended JSON的一部分,但这是你默认获得的,mongoexport我不认为你可以真正使用它作为查询的一部分.

如果尝试精确搜索,$date如下所示:

db.foo.find({dt: {"$date": "2012-01-01T15:00:00.000Z"}})
Run Code Online (Sandbox Code Playgroud)

你会得到错误:

error: { "$err" : "invalid operator: $date", "code" : 10068 }
Run Code Online (Sandbox Code Playgroud)

试试这个:

db.mycollection.find({
    "dt" : {"$gte": new Date("2013-10-01T00:00:00.000Z")}
})
Run Code Online (Sandbox Code Playgroud)

或(以下@ user3805045的评论):

db.mycollection.find({
    "dt" : {"$gte": ISODate("2013-10-01T00:00:00.000Z")}
})
Run Code Online (Sandbox Code Playgroud)

ISODate可能还需要在没有时间的情况下比较日期(由@MattMolnar注明).

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

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

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

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

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

  • 是啊.我认为当你在Spring中打印出```````对象时,我被抛出了什么.查询的序列化形式不一定是可以复制/粘贴到mongo shell中的有效查询,这本身就是令人沮丧的.罪魁祸首在于:http://grepcode.com/file/repo1.maven.org/maven2/org.mongodb/mongo-java-driver/2.8.0/com/mongodb/util/JSONSerializers.java#208 (2认同)
  • 在比较部分(无时间)日期时,我不得不从`new Date('2016-03-09')`切换到`ISODate('2016-03-09')`.前者将返回过去的日期以查询`$ gte`. (2认同)

Ste*_*HHH 88

MongoDB食谱页面评论:

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

这对我有用.在完整上下文中,以下命令获取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") }})
Run Code Online (Sandbox Code Playgroud)

  • 我收到“ISODate 未定义”错误。我无法解决这个问题。 (2认同)

Jab*_*bba 11

试试这个:

{ "dt" : { "$gte" : ISODate("2013-10-01") } }
Run Code Online (Sandbox Code Playgroud)


sid*_*hrc 5

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

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

在应用程序方面,我正在使用基于nodejs的驱动程序mongodb(v1.4.3),该应用程序在ui中使用datepicker,其给出的日期类似于YYYY-mm-dd,然后附加默认时间(如00:00:00),然后给出到new Date()构造函数,然后提供给mongodb条件对象,我认为驱动程序将日期转换为ISO日期,然后查询可以工作并提供所需的输出,但是对于同new Date()一个机器人,相同的构造函数不起作用或不显示相同的输出条件,这很奇怪,因为我使用了robomongo来交叉检查我的条件对象。

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

  • 谢谢你的提示,Robomongo 比 Mongo Compass 好得多 (2认同)

小智 5

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

{
    "dt": {
        "$gte": {
            "$date": "2013-10-01T00:00:00.000Z"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

只有在mlab.com上定义我的搜索查询的东西.