使用Mongoid和Ruby查询过去30天的日期范围?

时间:2011-10-15 14:37:24

标签: ruby mongodb mongoid date range

如何使用Mongoid和Ruby查询日期范围(比如说最近30天)?

我需要最终得到如下所示的数组或哈希:

{
    15 => 300,
    14 => 23,
    13 => 23
    ...
    30 => 20  # Goes over into previous month
    28 => 2
}

我目前正在使用DateTime实例以及unix时间戳整数字段存储每个文档。

上述哈希中的键是天数,值是这些天所有销售额的总和。

有什么想法吗?

5 个答案:

答案 0 :(得分:28)

有一种更简单的方法:

Sale.where(created_at: (30.days.ago..Time.now))

调整时间范围以适应。

答案 1 :(得分:20)

以下是如何在rubyland中完成所有工作:

sales_by_date = Hash.new(0)

Sale.where(:created_at.gte => (Date.today - 30)).order_by(:created_at, :desc).each do |s|
  sales_by_date[s.created_at.strftime("%m-%d")] += 1
end

这将创建一个带有“月 - 日”密钥的哈希,原因是某些月份少于30天,如果查询始终为30,则会导致密钥冲突。

如果您想要不同的范围,请更改查询:

# Between 10 and 20 days ago
start_day       = 10
end_day         = 20

Sale.where(:created_at.gte => (Date.today - end_day), :created_at.lte => (Date.today - start_day))

created_at更改为日期时间字段的名称。

答案 2 :(得分:4)

您也可以使用between方法编写查询,如:

Sale.between(created_at: (30.days.ago..Time.now))

答案 3 :(得分:2)

如果您忘记在模型中添加时间戳,该怎么办? :(

没问题!只需使用BSON:ObjectId

中的时间戳即可

在过去30天内获得销售。

Sale.where(:id.gte => Moped::BSON::ObjectId.from_time((Date.today - 30).to_time))

由于id字段是索引,因此这可能是最快的查询。

需要日期范围吗?饼。

从上个月开始销售。

Sale.and(
  {:id.gte => Moped::BSON::ObjectId.from_time((Date.today.prev_month.beginning_of_month).to_time)},
  {:id.lte => Moped::BSON::ObjectId.from_time((Date.today.prev_month.end_of_month).to_time)}
)

当然这个例子假定Rails约会帮助者......

答案 4 :(得分:0)

您可以通过对集合进行map_reduce调用来实现此目的,并使用仅发出相关条目的映射函数(日期值大于您提供的任何条件的条目)。

尝试这样的事情:

map = "function () { emit( {this.date.getDate(), {}} )}"
reduce = "function (key, values) { return {date: key, count: values.length } }"

collection.map_reduce(map, reduce, {query: {"date": {"$gt": 30.days.ago } } })

这可能有效。