2015-04-23 2 views
1

Я использую MongoDB 2.4.8, Mongoid 4.0.2 и Rails 4.2.1Запросы за последние 7 или 30 дней диапазон дат с MongoDB Mongoid рельсам

Я пытался получить запрос диапазона дат пробежал Mongoid чтобы вернуть правильный набор результатов по тестовым данным с помощью mongodb. Я создал всего 6 документов, охватывающих более 5-7 дней. Например, запрос ниже, должен вернуть 3 записи в течение дня между 22-й - 27, вместо этого он возвращает одну запись:

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 запись вместо 3 записей между 22 датами и 27

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) 

Любые предложения о том, как настроить это, чтобы вернуть 3 записи между диапазоном дат 22 - 27?

+0

Ваша проблема может быть не в правильности запроса ... [проверить эту проблему о датах mongoid в github] (https://github.com/mongoid/mongoid/issues/3590) –

+0

@artmees, спасибо за ссылка. – brg

+0

попробуйте выполнить следующие действия (которые работали на меня) 'DateTime.parse ('Wed, 22 Apr 2015 22:12:00 +0000'). In_time_zone ('UTC')' другие форматы дат не работали (как показано в выпуске) ... но обязательно используйте правильный часовой пояс –

ответ

0

Это, наконец, было разрешено. Мне нужно было хранящегося дату в переменной, а затем запросить его таким образом:

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> 
]