2011-03-15 23 views
11

Estoy tratando de almacenar una lista de ObjectIds en un documento como un campo de matriz.¿Cómo maneja Mongo DB un campo de matriz grande?

Entiendo que Mongo DB tiene un límite de tamaño de 4MB para documentos individuales. Por lo tanto, teniendo en cuenta que la longitud de ObjectId es de 12 bytes, un documento debería poder manejar más de 300,000 entradas en un campo de matriz. (Avíseme si el cálculo está desactivado).

Si el número de entradas en la matriz se acerca a ese límite, ¿qué tipo de rendimiento puedo esperar? ¿Especialmente cuando el campo está indexado? ¿Algún problema de memoria?


consultas típicas se vería como a continuación:

Consulta por un único valor

db.myCollection.find(
    { 
    myObjectIds: ObjectId('47cc67093475061e3d95369d') 
    } 
); 

Consulta por múltiples valores

db.myCollection.find(
    { 
    myObjectIds: {$in: [ObjectId('47cc67093475061e3d95369d'), ...]} 
    } 
); 

agregar un nuevo valor a varios documentos

db.myCollection.update(
    { 
    _id: {$in: [ObjectId('56cc67093475061e3d95369d'), ...]} 
    }, 
    { 
    $addToSet: {myObjectIds: ObjectId('69cc67093475061e3d95369d')} 
    } 
); 


+0

FYI: en 1.8, el tamaño máximo de documento se ha aumentado a 16 MB, y este límite es un límite suave impuesto por 10gen. Alguien en SO lo expresó mejor: (paráfrasis) El límite se estableció para obligarnos a pensar un poco más sobre nuestro diseño de esquema. –

+0

@Bryan Migliorisi Gracias, me he encontrado con esa publicación y estoy de acuerdo con ser más inteligente sobre el diseño de esquemas. – Jaepil

Respuesta

4

TBH, yo creo que lo mejor que puede hacer es establecer criterios de referencia. Cree algunos datos ficticios y pruebe el rendimiento a medida que aumenta la cantidad de elementos en el conjunto. Puede ser más rápido demoler una prueba en su entorno que esperar una respuesta aquí

Una de las cosas de mi lista de cosas por hacer es investigar y escribir en el blog, pero todavía no lo he logrado. Si lo haces, definitivamente me interesaría ver cuáles son tus hallazgos. Del mismo modo, si me acerco pronto, también publicaré los resultados aquí.

+0

No estaba planeando hacer un punto de referencia. Pero si lo hago, compartiré mi hallazgo aquí. Gracias. – Jaepil

2

No se dará cuenta cuando alcance el límite de tamaño del documento a menos que use getLastError después de cada actualización. La actualización fallará y se registrará un mensaje en el registro de la base de datos. Tengo evidencia anecdótica de mi operador local de que Mongo parece estar trabajando más duro cuando hay muchas actualizaciones que fallan debido al tamaño del documento que se está alcanzando.

No conozco una manera fácil de evitarlo, aparte de diseñar a su alrededor. Hasta donde yo sé, no hay forma de presionar condicionalmente una lista. He visto otras preguntas aquí en SO donde la gente ha estado tratando de crear listas de tamaño fijo y cosas por el estilo, pero no se han encontrado buenas soluciones.

+0

Gracias, realmente no pensé en lo que sucedería cuando se alcanzara el límite. Claramente necesito prestarle más atención. – Jaepil

4

Con el lanzamiento de mongo 2.4 puede usar matrices con tope. En el inserto, puedes decirle a mongo $ sort y $ cortar la matriz para mantenerla en una longitud fija según tus criterios (si no te importa tirar datos). Por ejemplo, puede usar esto para guardar las N entradas más recientes en un registro de datos.

Cuestiones relacionadas