Ruby on rails 使用mongodb mongoid rails查询最近7天或30天的日期范围
我使用的是Mongodb 2.4.8、Mongoid 4.0.2和Rails 4.2.1 我一直在尝试通过mongoid运行一个日期范围查询,以返回mongodb测试数据的正确结果集。我只创建了6个文档,跨越5-7天。例如,下面的查询应该返回22-27日之间的3条记录,而不是返回一条记录:Ruby on rails 使用mongodb mongoid rails查询最近7天或30天的日期范围,ruby-on-rails,mongodb,ruby-on-rails-4,mongoid,mongoid4,Ruby On Rails,Mongodb,Ruby On Rails 4,Mongoid,Mongoid4,我使用的是Mongodb 2.4.8、Mongoid 4.0.2和Rails 4.2.1 我一直在尝试通过mongoid运行一个日期范围查询,以返回mongodb测试数据的正确结果集。我只创建了6个文档,跨越5-7天。例如,下面的查询应该返回22-27日之间的3条记录,而不是返回一条记录: Person.where(:person_email_clicks.elem_match => {:date.gte => 'Wed, 22 Apr 2015 22:12:00 +0000'},
Person.where(:person_email_clicks.elem_match => {:date.gte => 'Wed, 22 Apr 2015 22:12:00 +0000'}, :person_email_clicks.elem_match => {:date.lte => 'Mon, 27 Apr 2015 22:12:00 +0000'})
这是用于测试目的的完整文档:
{"_id"=>BSON::ObjectId('55364a416461760bf1000000'),
"status"=>"premium"
"person_email_clicks"=>[
{"_id"=>BSON::ObjectId('55381d256461760b6c000000'), "name"=>"buyer", "date"=>2015-04-22 22:12:00 UTC},
{"_id"=>BSON::ObjectId('55381d536461760b6c010000'), "name"=>"seller", "date"=>2015-04-23 01:12:00 UTC},
{"_id"=>BSON::ObjectId('55381d916461760b6c020000'), "name"=>"giver", "date"=>2015-04-24 22:12:00 UTC},
{"_id"=>BSON::ObjectId('55381dac6461760b6c030000'), "name"=>"help", "date"=>2015-04-27 22:12:00 UTC},
{"_id"=>BSON::ObjectId('553824ba6461760b6c040000'), "name"=>"tt", "date"=>2015-04-22 22:12:00 UTC},
{"_id"=>BSON::ObjectId('553824bf6461760b6c050000'), "name"=>"tt", "date"=>2015-04-22 22:12:00 UTC},
{"_id"=>BSON::ObjectId('55382ad46461760b6c060000'), "name"=>"yyy", "date"=>2015-04-25 22:12:00 UTC}
]
}
以下是模型:
class Person
include Mongoid::Document
field :status, type: String
embeds_many :person_email_clicks
end
class PersonEmailClick
include Mongoid::Document
field :name, type: String
field :date, type: DateTime
embedded_in :person
end
这些是我迄今为止尝试过的查询,它们都返回1条记录,而不是22日和27日之间的3条记录
u = Person.first.person_email_clicks.first.date
We store the datetime which is Wed, 22 Apr 2015 22:12:00 +0000
e = Person.first.person_email_clicks.last.date
We store the the 2nd date which is Mon, 27 Apr 2015 22:12:00 +0000
现在,我在查询中使用这些保存日期的变量,下面所有3个查询都返回一条记录,而不是3条:
f = Person.where(:person_email_clicks.elem_match => {:date.gte => u}, :person_email_clicks.elem_match => {:date.lte => e})
f = Person.where(:person_email_clicks.elem_match => {:date => {"lte" => u}}, :person_email_clicks.elem_match => {:date => {"gte" => e}})
t = Person.where('person_email_clicks.date' => u..e)
关于如何调整此参数以返回22-27日之间的3条记录的任何建议?此问题最终得到解决。我需要将日期存储在变量中,然后通过以下方式进行查询:
Person.first.person_email_clicks.gt(date: u).lt(date: e).
或者这样查询:
Person.first.person_email_clicks.where({:date.gt => u, :date.lt => e})
这是获得所需结果的完整步骤:
u = Person.first.person_email_clicks.first.date
=> Wed, 22 Apr 2015 22:12:00 +0000
e = Person.first.person_email_clicks.last.date
=> Sat, 25 Apr 2015 22:12:00 +0000
h = Person.first.person_email_clicks.gt(date: u).lt(date: e).to_a
返回2条记录,如下所示:
=> [
#<PersonEmailClick _id: 55381d536461760b6c010000, name: "seller", date: 2015-04-23 01:12:00 UTC, daily_total: 0, email_open: 0, page_views: 0, clicks: 0, visits: 0>,
#<PersonEmailClick _id: 55381d916461760b6c020000, name: "giver", date: 2015-04-24 22:12:00 UTC, daily_total: 0, email_open: 0, page_views: 0, clicks: 0, visits: 0>
]
=>[
#,
#
]
您的问题可能不在于查询的正确性@artmees,感谢您的链接。请尝试使用以下(对我有效的)日期时间进行查询。解析('Wed,Apr 2015 22 22:12:00+0000')。在时区('UTC')其他日期格式不起作用(如本期所示)。。。但一定要使用正确的时区。我只是尝试了一个范围查询,它仍然返回了1条记录。这是我运行Person.where(:Person\u email\u clicks.elem\u match=>{:date.gte=>DateTime.parse('Wed,Apr 2015 22:12:00+0000')。在时区('UTC')},:Person\u email\u clicks.elem\u match=>{:date date time.parse('Mon,Apr 2015 22:12:00+0000')。在时区('UTC'))确定最后一件事,以确保您没有因为秒值而丢失一些记录。。。按如下方式尝试:Person.where(:Person\u email\u clicks.elem\u match=>{:date.gte=>DateTime.parse('Wed,Apr 2015 22:12:00+0000')。在时区('UTC')。开始一天的时间,:Person\u email\u clicks.elem\u match=>{:date DateTime.parse('Mon,Apr 2015 22:12:00+0000')。在时区('UTC')。结束一天的时间)
注意一天的开始和结束