2013-02-08 8 views
11

Ho una query mongo nella mia app per rails che sta scadendo perché la raccolta è enorme.Query Mongo che utilizza mongoid nell'app per rails che causa errore di timeout del cursore

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

Ho letto dalla documentazione che è possibile aggiungere l'opzione timeout per evitare che il cursore da timeout con il seguente messaggio:

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

Ho provato diversi modi tra cui

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

e

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

ma nessuno di questi impedisce il timeout del cursore.

Qualcuno sa come posso fare questa query e raccogliere tutti i FbCheckins senza il tempo di sincronizzazione del cursore in anticipo?

Grazie

+1

Questa [discussione sulla mailing list mongoid] (https://groups.google.com/d/topic/mongoid/9QxJZg9sSZo/discussion) potrebbe fornire alcuni suggerimenti utili. –

+0

@PrakashMurthy grazie, darò un'occhiata a questo – Huy

+0

Hai trovato una soluzione? – cortex

risposta

-3

mongoid ucciderà interrogazione molto tempo per impostazione predefinita e poi alzare questo errore

è possibile modificare l'opzione raise_not_found_error in mongoid.yml per evitare questo errore

ad esempio:

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

"raise_not_found_error (true): genererà un Mongoid :: Errors :: DocumentNotFound quando tenterà di trovare un documento con un ID inesistente, se impostato su false restituirà nil solo per la stessa query." – cortex

26

Quello che vuoi è impostare il timeout del cursore su false quando stai interrogando mongodb.

Ecco cosa si può fare con mongoid 3:

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

Ho avuto lo stesso problema di @Huy. In un'attività in background ito iter Object.all durante l'aggiornamento del db. L'aggiornamento proviene da dati Web di data mining e pertanto ha un ritardo di recupero in ogni ciclo per evitare troppi recuperi di pagine remote. Ciò ha causato il timeout del cursore. @ La soluzione di Quentin ha risolto il problema. Ho cambiato il mio codice in '' 'Object.all.no_timeout.each do | object |' '' e scorre allegramente. – pferrel

2

Usa 'no_cursor_timeout' opzione insieme con la query incontrare durante l'utilizzo Mongo Rubino Driver.

Disabilita tutti i timeout del cursore. Di default MongoDB prova ad uccidere tutti i cursori che sono rimasti inattivi per più di 10 minuti.

Altre informazioni possono essere trovate here.

Problemi correlati