2011-11-21 4 views
30

Sé que MongoDB es capaz de manejar una gran cantidad de solicitudes/seg, pero digamos que tengo que consultar una gran cantidad de documentos de una colección dado su _id; lo que suena mejor: hacer $ in en el atributo _id con todos los ID que quiero obtener, o recorrer las consultas de FindOne?

Respuesta

32

Definitivamente voy con el uso de la consulta $ in y proporcionando una matriz de _ids.

Ejemplo:

db.collection.find({ 
    "key": { 
     "$in": [ 
      ObjectId("xxx"), 
      ObjectId("yyy"), 
      ObjectId("zzz") 
     ] 
    } 
}) 

¿Por qué?

  • Si realiza un bucle, hay una cierta cantidad de configuración y desmontaje para cada consulta que crea y agota cursores que crearían sobrecarga.
  • Si no está haciendo esto en una máquina local, también crea sobrecarga de tcp/ip para cada solicitud. Localmente, podrías usar sockets de dominio.
  • Hay un índice en "_id" creado de forma predeterminada y la recopilación de un grupo de documentos para devolver en una solicitud por lotes debe ser extremadamente rápido, por lo que no es necesario dividirlo en consultas más pequeñas.

Existe documentación adicional here si desea verificarlo.

+8

¿Qué pasa si hay un montón de artículos en $ en ... decir 100, o 1,000? – ewindsor

+0

@ewindsor algo hasta 1000 generalmente está bien. Después de eso, reconsideraría el esquema que tienes y comenzaré a calcular previamente los datos. –

+1

¿se puede usar '$ in' en una matriz de objetos JSON? –

Cuestiones relacionadas