2011-11-21 24 views
5

Tôi cần phải viết truy vấn tìm tất cả tài liệu được tạo vào ngày được chỉ định.MongoMapper: tìm tất cả tài liệu được tạo vào ngày được chỉ định

Giả sử ngày đó là ngày hôm nay.

Tôi cố gắng này:

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

nhưng tôi nhận:

Không thể serialize một đối tượng của lớp ngày vào BSON.

Cảm ơn sự giúp đỡ của bạn.

CẬP NHẬT Liên kết này giải thích cách thực hiện như vậy Date Range Queries With MongoMapper.

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

Liên kết ở trên không hoạt động nữa. – user2573222

Trả lời

5

CẬP NHẬT: Liên kết này giải thích cách thực hiện như vậy Date Range Queries With MongoMapper.

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

Chỉ cần sử dụng Time.now thay thế. Trình điều khiển Ruby biết cách xử lý đối tượng Time.

doc = {:created_at => Time.now} 

hoặc

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

Sau đó, bạn có thể kiểm tra xem tài liệu sẽ serialize mà không cần ném một lỗi trong IRB như thế này:

require 'bson' 

BSON.serialize(doc) 

Nếu bạn nhận được một lỗi, hãy thử lại. Nếu nó phun ra một đối tượng bson được tuần tự hóa, bạn tốt để đi!

Nếu bạn tò mò, hãy kiểm tra nguồn gốc của phương pháp to_mongo trong trình điều khiển mongomapper here

2

bạn :created_at là một ngày (như trong "Ngày JavaScript phong cách với cả ngày tháng và thời gian của ngày linh kiện"), đúng? Bạn sẽ cần phải tìm ra ranh giới của ngày được đề cập trong UTC, tạo Time trường hợp cho các ranh giới đó và sau đó tìm kiếm mọi thứ giữa những lần đó.

Giả sử rằng múi giờ địa phương của bạn được cấu hình đúng và bạn muốn tất cả những gì đã được tạo ra trên 2011/11/21, sau đó một cái gì đó như thế này sẽ giúp bạn có:

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 }) 

Bạn cũng có thể sử dụng Time.new(2011, 11, 21).utcTime.new(2011, 11, 22).utc nhưng tôi thích những số không phụ như một lời nhắc nhở rằng tôi không thực sự làm việc chỉ với một ngày.

Các vấn đề liên quan