2011-09-23 7 views
8

He obtenido una serie de identificadores a través de MapReduce. He solucionaron esos identificadores de algunos criterios y ahora tengo que conseguir esos objetos en este orden en particular:Mongoid: encontrar a través de la matriz de identificadores

MyModel.find(ids) 

derecho? Pero devuelve objetos que no están en el orden en que se almacenan los identificadores. Parece que esto es lo mismo que

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

que no volverá objetos inverosímiles en apenas el mismo orden que los identificadores almacenados.

Ahora puedo hacer esto

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

la que va a hacer el trabajo, pero va a eliminar la base de datos muchas veces.

Respuesta

9

Puede hacer el pedido a mano después de tener todos sus objetos. Algo como esto:

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

¿Es más rápido que recuperar cada elemento de db? – fl00r

+0

@ fl00r: Debería ser, solo un acceso MongoDB para buscar los modelos y un tipo simple (con Transformada Schwartzian incorporada) para obtener las cosas en el orden deseado. El acceso a la base de datos generalmente es la parte cara. Intente compararlo, es difícil garantizar cualquier cosa sin acceso a datos reales. –

+0

@muistooshort, estoy enfrentando un problema similar. En general, ¿es cierto que sería una mejor práctica para minimizar los hits de DB? –

10

estaba trabajando en un problema similar y encontró la solución un poco más concisa:

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

básicamente utilizando el bloque de tipo de enganchar el índice del elemento.

Cuestiones relacionadas