【问题标题】:Use MongoID to find a record by month and day, ignoring year and time使用 MongoID 按月和日查找记录,忽略年份和时间
【发布时间】:2013-09-22 05:13:20
【问题描述】:

我有一个模型(事件),有五年的记录(每天一条记录)。我需要一种方法,当传递诸如 2011-12-25 00:00:00 之类的日期对象时,将向我显示 12/25 发生的所有记录(查询 :created_at 列),无论年份如何或过去的时间。

我尝试了以下查询来检索给定日期之间的数据,但是在一年更改后我遇到了一个问题,我的查询无法检索记录。例如记录 sdate="1-06-2013" 和 edate ="2-2-2014" 我想要 1 月 1 日的记录,那么我怎样才能获得这些数据。

db.events.find("this.sdate.getMonth() > 6 && this.edate.getMonth()

我需要在 Mongoid 而不是 ActiveRecord 中使用精确的以下查询

Model.where("MONTH(created_at) = ? and DAY(created_at) = ?", somedate.month, somedate.day)

【问题讨论】:

  • 您需要使用聚合框架来获得此结果,因为常规查询引擎不支持仅提取日期的月份和日期并对其进行操作。出于性能原因,不推荐使用where
  • 本问答为您提供了一些细节:stackoverflow.com/questions/8136652/…

标签: ruby-on-rails mongodb mongoid


【解决方案1】:

编辑:(我的第一个答案错过了它应该忽略年份和时间的事实)

像这样使用聚合管道:

project = { '$project' => { 
              'day' => { '$dayOfMonth' => '$created_at' },
              'month' => { '$month' => '$created_at' }
            }
          }
match = { '$match' => { 'day' => 25, 'month' => 12 } }

Events.collection.aggregate([project, match])

这应该会返回一个哈希数组,其中包含预计的日期和月份值以及匹配事件的 _id。然后,您可以将它们映射回事件或您需要对它们执行的任何操作。

【讨论】:

    【解决方案2】:

    你可以尝试做一些 Javascripting 查询

    db.mydatabase.mycollection.find({$where : 'return this.date.getMonth() == 11'})
    

    但我永远不会这样做。我要做的是将月日存储在一个字段中,在上面有一个索引,并有一个更快的查询。否则你将扫描所有的dos。

    【讨论】:

    • 我尝试了以下查询来检索给定日期之间的数据,但我在一年更改后遇到问题,我的查询无法检索记录。例如记录 sdate="1-06-2013" 和 edate ="2-2-2014" 我想要 1 月 1 日的记录,那么我该如何获取这些数据。 db.events.find("this.sdate.getMonth() > 6 && this.edate.getMonth()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    相关资源
    最近更新 更多