227

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

谢谢!

4

11 回答 11

373

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

或(在@user3805045发表评论之后):

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 连接器。

于 2013-11-06T18:48:17.887 回答
107

来自MongoDB 食谱页面评论:

"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") }})
于 2014-07-02T21:20:30.720 回答
15

试试这个:

{ "dt" : { "$gte" : ISODate("2013-10-01") } }
于 2016-01-18T11:06:20.003 回答
6

我正在使用 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()构造函数不起作用或在 robo mongo 上显示相同的输出,对于相同标准,这很奇怪,因为我使用 robomongo 来交叉检查我的标准对象。

而默认的 cli mongoshellISODatenew Date()

于 2016-02-11T09:54:08.237 回答
5

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

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

唯一可以在 mlab.com 上定义我的搜索查询的东西。

于 2016-10-24T10:27:42.230 回答
3

这是我的文件

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

这对我有用。

于 2017-05-01T07:12:59.760 回答
2

在 MongoDB 外壳中:

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

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

于 2015-08-30T16:58:51.723 回答
2

new Date()

{ "dt" : { "$lt" : new Date("2012-01-01T15:00:00.000Z") } }
于 2020-05-17T07:10:48.707 回答
2

老问题,但仍然是第一个谷歌点击,所以我在这里发布,以便我更容易再次找到它......

使用 Mongo 4.2 和一个聚合():

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

于 2020-06-03T10:54:09.513 回答
0

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

db.collectionName.find({ "dt": { "$lte" : new Date() + "" } });
于 2019-11-13T19:23:24.927 回答
0

尽管我针对 AWS DocumentDB(应该与 Mongo 4 兼容)对此进行了测试,但这对我来说很好,无需使用Dateor ISODate

db.collection_name.find({"an_iso_date_field": {$lte: "2021-02-04T03:42:00Z"}})
于 2021-08-23T11:28:33.600 回答