2013-02-08 8 views
11

Tôi có một truy vấn mongo trong ứng dụng đường ray của tôi đã hết thời gian vì bộ sưu tập rất lớn.Truy vấn Mongo sử dụng mongoid trong ứng dụng đường ray gây ra lỗi hết thời gian chờ của con trỏ

FbCheckin.where(ext_fb_place_id: self.ext_fb_place_id).all 

Tôi đã đọc từ tài liệu mà bạn có thể thêm một lựa chọn timeout để ngăn chặn con trỏ từ thời điểm ra với thông báo sau:

Moped::Errors::CursorNotFound: The operation: "GET MORE" failed with error 

Tôi đã thử nhiều cách bao gồm

FbCheckin.where(ext_fb_place_id: ext_fb_place_id, {:timeout=>false}).all 

FbCheckin.find(ext_fb_place_id: ext_fb_place_id, {:timeout=>false}).all 

nhưng không cách nào trong số này ngăn con trỏ khỏi thời gian chờ.

Có ai biết làm thế nào tôi có thể thực hiện truy vấn này và thu thập tất cả FbCheckins mà không có thời gian con trỏ ra trước?

Cảm ơn

+1

Điều này [thảo luận về danh sách gửi thư mongoid] (https://groups.google.com/d/topic/mongoid/9QxJZg9sSZo/discussion) có thể cung cấp một số gợi ý hữu ích. –

+0

@PrakashMurthy cảm ơn, tôi sẽ xem xét điều này – Huy

+0

Bạn đã tìm thấy giải pháp chưa? – cortex

Trả lời

-3

mongoid sẽ giết truy vấn thời gian dài theo mặc định và sau đó nâng cao được lỗi này

bạn có thể thay đổi tùy chọn raise_not_found_error trong mongoid.yml để tránh lỗi này

ví dụ:

production: 
    sessions: 
    default: 
    database: local 
    hosts: 
     - localhost:27017 
    options: 
     allow_dynamic_fields: true 
     raise_not_found_error: false 
+1

"raise_not_found_error (true): Sẽ nâng cấp Mongoid :: Errors :: DocumentNotFound khi cố tìm tài liệu bằng id không tồn tại. Khi được đặt thành false sẽ chỉ trả về 0 cho cùng một truy vấn." – cortex

26

Điều bạn muốn là đặt thời gian chờ con trỏ thành sai khi bạn đang truy vấn mongodb.

Dưới đây là những gì bạn có thể làm với mongoid 3:

FbCheckin.where(...).no_timeout.each do |fb_checkin| 
    "do something with fb_checkin" 
end 
+2

Tôi gặp vấn đề tương tự như @Huy. Trong một nhiệm vụ nền, tôi lặp lại Object.all trong khi cập nhật db. Bản cập nhật đến từ dữ liệu web khai thác và do đó nó có độ trễ tìm nạp trong mỗi vòng lặp để tránh quá tải trang từ xa thường xuyên. Điều này khiến con trỏ hết thời gian chờ. @ Quentin của giải pháp giải quyết vấn đề. Tôi đã thay đổi mã của mình thành '' 'Object.all.no_timeout.each do | object |' '' và nó đang chạy một cách vui vẻ. – pferrel

2

Sử dụng 'no_cursor_timeout' tùy chọn cùng với các truy vấn tìm trong khi sử dụng Mongo của Ruby Driver.

Điều này sẽ tắt tất cả thời gian chờ của con trỏ. Theo mặc định MongoDB cố gắng giết tất cả các con trỏ đã không hoạt động trong hơn 10 phút.

Thông tin khác có thể được tìm thấy here.