【问题标题】:mongodb date query don't work with ISODate?mongodb 日期查询不适用于 ISODate?
【发布时间】:2020-11-28 09:42:36
【问题描述】:

我可以通过这个搜索找到一个项目:

db.item.find({"startdate":{$gte: 1485521569000 }})

日期好像对应

> new Date(1485521569000)
  ISODate("2017-01-27T12:52:49Z")

但如果我搜索

db.item.find({"startdate":{"$gte" : ISODate("2017-01-01T00:00:00Z")}})

我没有得到任何结果。我做错了什么?

PS 我找到的唯一方法是

 db.item.find({"startdate":{"$gte" : (new Date("2017-01-01")).getTime()}})

这是对的还是有更好的方法?

【问题讨论】:

  • 请从您的item 集合中发布一个示例文档,其中显示字段startdate

标签: mongodb mongodb-query


【解决方案1】:

下面的一个就可以了。

db.getCollection('test').find({
  "key": {
    "$gte": (ISODate("2017-01-01")).getTime()
  }
})

原因:

您的数据位于int64long

new Date 查询中,您将日期转换为返回int 的时间。所以get 执行integer 比较。

ISODate 中,您传递了一个日期,它不会将日期转换为integer,即毫秒。因此,如果您转换,两者都可以工作。

new Date() 以 Date 对象的形式返回当前日期。 mongo shell 使用 ISODate 帮助器包装 Date 对象

var d = ISODate("2017-01-01")
print(d); //Sun Jan 01 2017 05:30:00 GMT+0530 (IST)

因此,比较失败。

【讨论】:

    【解决方案2】:

    如果我理解,您在startdate 字段中有时间戳,

    如果对您有帮助,这是一个选项,可以使用 aggregate() 功能,使用 $toDate

    • $toDate 将时间戳转换为 ISO 日期
    db.collection.aggregate([
      {
        $match: {
          $expr: {
            $gte: [
              {
                $toDate: "$startdate"
              },
              ISODate("2017-01-27T12:52:49.000Z")
            ]
          }
        }
      }
    ])
    

    游乐场:https://mongoplayground.net/p/H7SFHsgOcCu

    【讨论】:

    • 完美的处理方法。
    • @Gibbs 嗯,顺便说一句,使用 find() 时,您的答案的解释非常好。
    猜你喜欢
    • 2013-11-18
    • 2017-05-21
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多