【问题标题】:Mongoid date range queryMongoid 日期范围查询
【发布时间】:2011-08-19 21:29:28
【问题描述】:

我似乎找不到任何东西可以使用 Mongoid/Rails 进行日期范围查询。以下是我尝试过的一些查询(在大约 100 个其他查询中)。如果它返回任何内容,它总是忽略“end_date”。两个日期都是日期时间...

all(:conditions => {:created_at => start_date.to_datetime..end_date.to_datetime})

结果:

NoMethodError: undefined method `to_i' for Tue, 26 Apr 2011 00:00:00 +0000..Fri, 06 May 2011 00:00:00 +0000:Range

另一个例子...

where(:created_at => {'$gte' => start_date,'$lt' => end_date})

导致查询成功,但结束日期被忽略。结果在开始日期后正确返回,但不受结束日期限制。

我已经在这个问题上工作了好几天,但无济于事。在网上、论坛或 IRC 中没有太多帮助。

很想知道我做错了什么:)

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid


    【解决方案1】:

    【讨论】:

    • 确实,这已在 Mongoid 2.0.2 中修复,但我无法在任何地方找到任何有关此错误修复的文档……这有点令人担忧,此类错误可能会对我的应用程序产生重大影响。 ..如果它在未来的版本中再次中断,不确定如何防止此类问题:(
    • 它似乎又坏了。这里是 Mongoid 3.0,同样的问题。
    【解决方案2】:

    我做了一些研究,发现了 Advanced Queries 的帖子,其中一位用户问:

    有没有更好的排序或查询方式 使用日期时间比较,比 将日期存储在 Mongo 中 自纪元以来的整数秒?这 是目前唯一的方法 为我工作以进行 gte 比较 在 Mongo 中检索结果。

    另一个用户对此的回复:

    使用原生 BSON 日期类型。 在内部,它是一个 64 位整数 自以来的毫秒数 纪元。

    因此,您可能希望以不同的方式处理此问题,并在范围查询自纪元以来的毫秒数之间进行转换。这样你就在整数上做一个简单的gte/lt。用户的建议相对较新(3 个月前发布),因此它可能仍然是与一般的 Mongo(以及 Mongoid)比较日期的最简单方法。

    【讨论】:

      【解决方案3】:

      我使用 MongoDB shell 对此进行了测试:

      多次执行

      db.con.save({created: new Date()})

      然后我得到了

      > db.con.find()
      { "_id" : ObjectId("4dc3d380724a42d80d636b09"), "created" : ISODate("2011-05-06T10:54:56.809Z") }
      { "_id" : ObjectId("4dc3d383724a42d80d636b0a"), "created" : ISODate("2011-05-06T10:54:59.699Z") }
      { "_id" : ObjectId("4dc3d385724a42d80d636b0b"), "created" : ISODate("2011-05-06T10:55:01.543Z") }
      { "_id" : ObjectId("4dc3d38b724a42d80d636b0c"), "created" : ISODate("2011-05-06T10:55:07.043Z") }
      { "_id" : ObjectId("4dc3d38c724a42d80d636b0d"), "created" : ISODate("2011-05-06T10:55:08.168Z") }
      { "_id" : ObjectId("4dc3d49d4087861731076f8a"), "created" : ISODate("2011-05-06T10:59:41.755Z") }
      

      作为拆分日期,我选择ISODate("2011-05-06T10:55:00Z") 使用d = new Date(2011,04,06,12,55,00) 创建此日期,因为月份从零开始,时间是UTC 时区。 现在db.con.find({"created": {$gt:d}}) 产生

      { "_id" : ObjectId("4dc3d385724a42d80d636b0b"), "created" : ISODate("2011-05-06T10:55:01.543Z") }
      { "_id" : ObjectId("4dc3d38b724a42d80d636b0c"), "created" : ISODate("2011-05-06T10:55:07.043Z") }
      { "_id" : ObjectId("4dc3d38c724a42d80d636b0d"), "created" : ISODate("2011-05-06T10:55:08.168Z") }
      { "_id" : ObjectId("4dc3d49d4087861731076f8a"), "created" : ISODate("2011-05-06T10:59:41.755Z") }
      

      所以 MongoDb 做的一切都是正确的。我不知道如何在 Ruby 中做到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多