如何使用Mongoid和Ruby查询日期范围(例如从现在开始的最后30天)?
我需要以如下所示的数组或散列结束:
{
15 => 300,
14 => 23,
13 => 23
...
30 => 20 # Goes over into previous month
28 => 2
}
我目前使用DateTime实例以及unix时间戳整数字段存储每个文档。
上面散列中的键是天数,值是这些天数的所有销售额之和。
任何想法?
有一个更简单的方法:
Sale.where(created_at: (30.days.ago..Time.now))
如何在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
更改为datetime字段的名称
您还可以使用between
方法编写查询,如:
Sale.between(created_at: (30.days.ago..Time.now))
如果忘记在模型中添加时间戳该怎么办?(
没问题!只需使用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日期助手…
您可以实现这一点,例如,通过使用仅发出相关条目(其日期值大于您给出的任何条件的条目)的map函数对集合进行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 } } })