小编典典

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

all

我似乎无法让最基本的日期查询在 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

谢谢!


阅读 107

收藏
2022-06-06

共1个答案

小编典典

虽然$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")}
})

或(在发表评论之后):

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

ISODate可能还需要比较没有时间的日期(@MattMolnar指出)。

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

mongo shell 提供了多种方法来返回日期,无论是作为字符串还是作为 Date 对象:

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

并且 usingISODate 仍然应该返回一个 Date
对象

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

2022-06-06