2011-11-21 1 views
5

지정된 날짜에 작성된 모든 문서를 찾는 쿼리를 작성해야합니다.MongoMapper : 지정된 날짜에 생성 된 모든 문서 찾기

오늘 날짜를 가정 해 봅시다.

나는이 시도 :

Document.all(:created_at => Date.parse(Time.now.strftime('%Y/%m/%d'))) 

을하지만 난 가지고 :

는 BSON으로 Date 클래스의 객체를 직렬화 할 수 없습니다.

도움 주셔서 감사합니다.

업데이트 이 링크는 방법을 설명합니다 Date Range Queries With MongoMapper.

Document.count(:created_at => { '$gt' => 2.days.ago.midnight, '$lt' => 1.day.ago.midnight }) 
+0

위 링크는 더 이상 작동하지 않습니다. – user2573222

답변

2

대신 Time.now을 사용하십시오. 루비 드라이버는 Time 객체를 처리하는 방법을 알고 있습니다. 문서는 다음과 같이 IRB에서 오류를 던지고없이 직렬화 할 경우

doc = {:created_at => Time.now} 

또는

doc = {:created_at => Time.utc(12,1,12)} # year, month, day 

그런 다음 테스트 할 수 있습니다

require 'bson' 

BSON.serialize(doc) 

를 오류가 발생하면, 다시 시도하십시오. 직렬화 된 bson 객체를 뱉어 내면 갈 수 있습니다! 당신은 호기심이 있다면

, 귀하의 :created_at는 날짜 "날짜와 시간의 일 구성 요소를 모두 자바 스크립트 스타일의 날짜"에서와 같이 (이다 here

2

mongomapper 드라이버의 to_mongo 방법의 소스를 체크 아웃), 권리? 해당 날짜의 경계를 UTC로 파악한 다음 해당 경계에 대해 Time 인스턴스를 작성한 다음 해당 시간 사이의 모든 항목을 검색해야합니다. 현지 시간대가 올바르게 구성하고 2011-11-21에서 만든 모든 것을 원하는 가정

,이 같은 뭔가가 당신을 얻어야한다 :

start_time = Time.new(2011,11,21, 0,0,0).utc 
end_time = Time.new(2011,11,22, 0,0,0).utc 
docs  = Document.where(:created_at => { :$gte => start_time }). 
         where(:created_at => { :$lt => end_time }) 

또한 사용할 수 Time.new(2011, 11, 21).utcTime.new(2011, 11, 22).utc 하지만 나는 단지 날짜만으로는 실제로 작업하지 않는다는 것을 상기시키는 여분의 0을 좋아한다.