2011-09-23 11 views
8

Ho recuperato un numero di ID tramite MapReduce. Ho risolto tali ID da parte di alcuni criteri e ora ho bisogno di quegli oggetti in questo ordine particolare:Mongolo: trova attraverso la matrice di ID

MyModel.find(ids) 

Destra? Ma restituisce oggetti che non sono memorizzati negli ID ordine. Sembra che questo è lo stesso che

MyModel.where(:_id.in => ids) 

che non tornerà oggetti recuperati nel proprio stesso ordine in cui gli ID memorizzati.

Ora posso fare questo

ids.map{|id| MyModel.find(id)} 

, che farà il lavoro, ma sarà battere il database molte volte.

risposta

9

È possibile eseguire l'ordine a mano dopo avere tutti gli oggetti. Qualcosa di simile a questo:

ordering = { } 
ids.each_with_index { |id, i| ordering[id] = i } 
objs = MyModel.find(ids).sort_by { |o| ordering[o.id] } 
+1

è più veloce quindi recuperare ogni elemento da db? – fl00r

+0

@ fl00r: Dovrebbe essere, solo un accesso MongoDB per recuperare i modelli e un ordinamento semplice (con Trasformata Schwartzian incorporata) per ottenere le cose nell'ordine desiderato. L'accesso al database è generalmente la parte costosa. Prova a confrontarlo, è difficile garantire qualsiasi cosa senza accesso ai dati reali. –

+0

@muistooshort, sto affrontando un problema simile. In generale, è vero che sarebbe solo una pratica migliore per minimizzare i colpi db? –

10

stava lavorando su un problema simile e ha trovato una soluzione un po 'più concisa:

objs = MyModel.find(ids).sort_by{|m| ids.index(m.id) } 

fondamentalmente solo utilizzando il blocco tipo di intoppo l'indice dell'elemento.

Problemi correlati