HOWTO · MongoDB

Tamaño máximo de documento de MongoDB

Este tutorial describe el límite de tamaño máximo de documento en MongoDB. También explica cómo usar el límite de tamaño BSON predeterminado de manera eficiente y almacenar datos si excede el límite para almacenar documentos.

En esta página

MongoDB limita cada documento BSON a 16 MB. Si un registro supera ese tamaño, reduzca su tamaño codificado o traslade parte de los datos a otros documentos; para archivos grandes, considere GridFS. El límite se aplica a cada documento, no al tamaño total de una colección ni a un archivo representado mediante varios documentos de GridFS.

Tamaño máximo de un documento BSON en MongoDB

MongoDB almacena registros en BSON, un formato binario para documentos similares a JSON. BSON admite tipos de datos adicionales, como fechas y datos binarios. La documentación de límites de MongoDB establece un tamaño máximo de 16 MB para un documento BSON y una profundidad máxima de anidamiento de 100 niveles. Los arreglos y los documentos embebidos contribuyen a esa profundidad.

El límite se calcula a partir del documento BSON codificado, incluidos los nombres de campo, los marcadores de tipo, las longitudes y otros elementos estructurales. Por eso, el tamaño de una cadena JSON o el número de valores por sí solos no indican si un documento cabrá. Al diseñar los registros, deje margen por debajo del máximo y mida documentos representativos con las herramientas BSON del controlador de su aplicación antes de basarse en una estimación.

Cómo almacena GridFS archivos que superan el límite de tamaño de un documento

GridFS es una especificación de MongoDB para almacenar y recuperar archivos que superan el límite de un solo documento. Una implementación de GridFS divide el archivo en fragmentos que se guardan como documentos separados. De forma predeterminada, utiliza la colección fs.files para los metadatos del archivo y la colección fs.chunks para los datos de los fragmentos. Un documento del archivo lo identifica, y cada fragmento remite a él mediante files_id.

Esta estructura permite manejar un archivo grande por partes; no permite guardar un único documento BSON que supere el límite. Use la compatibilidad con GridFS que ofrece su controlador de MongoDB para cargar, recuperar o transmitir un archivo. El tamaño de los fragmentos y los detalles de la API dependen de la implementación y la configuración, así que consulte la documentación del controlador que utiliza.

Cómo mantener un documento BSON dentro del límite

Primero, identifique qué campos representan la mayor parte del tamaño codificado. Elimine los datos que puedan derivarse, evite repetir valores grandes y elija representaciones compactas cuando sigan siendo claras y fáciles de mantener. Comprimir una cadena en el código de la aplicación solo resulta útil si esta puede almacenar e interpretar los datos binarios resultantes; además, introduce consideraciones de procesamiento y compatibilidad.

Si un campo contiene un conjunto pequeño de cadenas repetidas, la codificación mediante diccionario permite almacenar una sola vez cada cadena distinta y representar sus apariciones mediante un índice. El siguiente ejemplo de Python ilustra esa transformación en memoria; no calcula el tamaño BSON ni se conecta a MongoDB.

Ejecute este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

values = ["pending", "complete", "pending", "pending"]
dictionary = list(dict.fromkeys(values))
indexes = [dictionary.index(value) for value in values]
print(dictionary)
print(indexes)

La codificación mediante diccionario puede reducir el texto repetido, pero los índices dificultan la inspección de los registros y requieren que el diccionario siga disponible y sea coherente. Puede no ser útil si la mayoría de los valores son únicos, y la estructura añadida también ocupa espacio. Mida documentos codificados representativos en lugar de dar por hecho que una transformación bastará para ajustarlos al límite.

Elija una estrategia de almacenamiento cuando los datos superen el límite

Use un documento más pequeño cuando los datos deban permanecer juntos y sea posible representarlos de forma más compacta sin perder información necesaria. Divida los datos en documentos relacionados cuando sus partes tengan ciclos de vida propios o se lean por separado; mantenga un identificador estable o una referencia para que la aplicación pueda recuperar los registros relacionados. Esto puede exigir lecturas adicionales en las consultas y requiere gestionar con cuidado las actualizaciones relacionadas.

Use GridFS para contenido de archivos grandes, como imágenes, audio o vídeo, cuando la aplicación necesite las funciones de almacenamiento y recuperación de archivos de MongoDB. Mantenga en documentos normales los atributos que se buscan o consultan con frecuencia y guarde una referencia al archivo de GridFS. GridFS no es la solución predeterminada para cualquier registro que supere el límite: primero determine si los datos son un archivo, datos estructurados relacionados o un documento que simplemente puede hacerse más pequeño.