Docs Menu
Docs Home
/

Límites y umbrales de MongoDB

Este documento proporciona una recopilación de limitaciones estrictas y flexibles del sistema MongoDB. Las limitaciones de esta página se aplican a las implementaciones alojadas en Atlas y a las implementaciones autoalojadas de MongoDB, a menos que se especifique lo contrario.

Las siguientes limitaciones se aplican únicamente a las implementaciones alojadas en MongoDB Atlas. Si alguna de estas limitaciones representa un problema para su organización, póngase en contacto con Soporte Atlas.

Componente
Limit

12

Particiones en clústeres de una sola región

70

Permisos de red entre regiones para un clúster multirregional

40. Además, si un clúster en cualquier proyecto abarca más de 40 regiones, no puede crear un clúster multiregional en este proyecto.

Nodos elegibles por set de réplicas o partición

7

Nivel de clúster para el servidor de configuración (mínimo y máximo)

M30

MongoDB Atlas limita las conexiones entrantes concurrentes según la clase y el nivel de clúster. Los límites de conexión de MongoDB Atlas se aplican por nodo. Para clústeres fragmentados, los límites de conexión de MongoDB Atlas se aplican por cada router mongos. El número de routers mongos es igual al número de nodos de set de réplicas en todos los fragmentos.

La preferencia de lectura también contribuye al número total de conexiones que MongoDB Atlas puede asignar para una determinada query.

MongoDB Atlas tiene los siguientes límites de conexión para los niveles de clúster especificados:

MongoDB Atlas Cluster Tier
Conexiones máximas por nodo

Free

500

Flex

500

M10

1500

M20

3000

M30

3000

M40

6000

M50

16000

M60

32000

M80

96000

M140

96000

M200

128000

M300

128000

MongoDB Atlas Cluster Tier
Conexiones máximas por nodo

M40

4000

M50

16000

M60

32000

M80

64000

M140

96000

M200

128000

M300

128000

M400

128000

M700

128000

MongoDB Atlas Cluster Tier
Conexiones máximas por nodo

Free

500

Flex

500

M10

1500

M20

3000

M30

3000

M40

6000

M50

16000

M60

32000

M80

64000

M140

96000

M200

128000

M300

128000

Nota

MongoDB Atlas reserva una pequeña cantidad de conexiones a cada clúster para soportar los servicios de MongoDB Atlas.

Si se conecta a una implementación multi-nube de MongoDB Atlas a través de una conexión privada, solo puede acceder a los nodos del mismo proveedor de nube desde el que se conecta. Este proveedor de nube podría no tener el nodo primario en su región. Cuando esto ocurra, debe especificar el modo de preferencia de lectura secundaria en la cadena de conexión para acceder a la implementación.

Si necesitas acceso a todos los nodos para tu implementación multinube de MongoDB Atlas desde tu proveedor actual a través de una conexión privada, debes realizar una de las siguientes acciones:

  • Configura una VPN en el proveedor actual para cada uno de los proveedores restantes.

  • Configure un nodo privado para MongoDB Atlas para cada uno de los proveedores restantes.

Aunque no hay un límite estricto en la cantidad de colecciones en un solo clúster de MongoDB Atlas, el rendimiento de un clúster podría degradarse si sirve una gran cantidad de colecciones e índices. Las colecciones más grandes tienen un mayor impacto en el rendimiento.

El número máximo combinado recomendado de colecciones e índices por nivel de clúster de MongoDB Atlas es el siguiente:

MongoDB Atlas Cluster Tier
Máximo recomendado

M10

5000 colecciones e índices

M20 / M30

10 000 colecciones e índices

M40/+

100 000 colecciones e índices

Las implementaciones de MongoDB Atlas tienen los siguientes límites de organización y proyecto:

Componente
Limit

Usuarios de base de datos por proyecto de MongoDB Atlas

100

Usuarios de Atlas por proyecto de MongoDB Atlas

500

Usuarios por organización de MongoDB Atlas

500

Claves API por organización de MongoDB Atlas

500

Entradas de la lista de acceso por proyecto de MongoDB Atlas

200

Usuarios por equipo de MongoDB Atlas

250

Equipos por proyecto de MongoDB Atlas

100

Equipos por organización de MongoDB Atlas

250

Equipos por usuario de MongoDB Atlas

100

Organizaciones por usuario de MongoDB Atlas

250

Organizaciones vinculadas por usuario de MongoDB Atlas

50

Clústeres por proyecto de MongoDB Atlas

25

Proyectos por organización de MongoDB Atlas

250

Roles personalizados de MongoDB por proyecto de MongoDB Atlas

100

Roles asignados a cada usuario de base de datos

100

Facturación por hora por organización de MongoDB Atlas

$50

Instancias federadas de bases de datos por proyecto de MongoDB Atlas

25

Total de conexiones peering de red por proyecto de MongoDB Atlas

50. Además, MongoDB Atlas limita el número de nodos por Conexión peering de red en función del bloque CIDR y la región seleccionada para el proyecto.

Total de conexiones peering de red pendientes por proyecto de MongoDB Atlas

25

Objetivos direccionables de AWS Private Link por región

50

Azure PrivateLink objetivos direccionables por región

150

Claves de fragmentación únicas por proyecto de clúster global gestionado por MongoDB Atlas

40. Esto solo se aplica a los clústeres globales con fragmentación gestionada por Atlas. No hay límites en la cantidad de claves de fragmentación únicas por proyecto para los clústeres globales con fragmentación autogestionada.

Free Clústeres por proyecto de MongoDB Atlas

1

Número de configuraciones de alertas para cada proyecto de MongoDB Atlas.

500

Las cuentas de servicio de MongoDB Atlas tienen los siguientes límites de organización y proyecto:

Componente
Limit

Cuentas de servicio de Atlas por organización de MongoDB Atlas

200

Entradas de la lista de acceso por cuenta de servicio de MongoDB Atlas

200

Secretos por cuenta de servicio de MongoDB Atlas

2

Tokens activos por cuenta de servicio de MongoDB Atlas

100

MongoDB Atlas limita la longitud y aplica los requisitos de ReGex para las siguientes etiquetas de componentes:

Componente
Límite de caracteres
Patrón RegEx

Nombre del clúster

64 [1]

^([a-zA-Z0-9]([a-zA-Z0-9-]){0,21}(?<!-)([\w]{0,42}))$ [2]

Nombre del proyecto

64

^[\p{L}\p{N}\-_.(),:&@+']{1,64}$ [3]

Nombre de la organización

64

^[\p{L}\p{N}\-_.(),:&@+']{1,64}$ [3]

Descripción de la llave de API

250

[1] Si tiene modo de emparejamiento exclusivo activado, el límite de caracteres del nombre del clúster es 23.
[2] MongoDB Atlas utiliza los primeros 23 caracteres del nombre de un clúster. Estos caracteres deben ser únicos dentro del proyecto del clúster. Los nombres de clústeres con menos de 23 caracteres no pueden terminar con un guión (-). Los nombres de clúster con más de 23 caracteres no pueden tener un guion como el carácter número 23.
[3](1, 2) Los nombres de organizaciones y proyectos pueden incluir cualquier letra o número Unicode, además de los siguientes signos de puntuación: -_.(),:&@+'.

Se aplican otras limitaciones a los clústeres gratuitos de MongoDB Atlas y a los clústeres Flex. Para aprender más, consulta los siguientes recursos:

Algunos comandos de MongoDB no son compatibles con MongoDB Atlas. Además, algunos comandos solo son compatibles con clústeres gratuitos de MongoDB Atlas. Para aprender más, consulta los siguientes recursos:

MongoDB no impone un límite estricto en los tamaños de las colecciones o bases de datos. El tamaño máximo de una colección o base de datos depende del sistema de archivos del servidor host. Por ejemplo:

  • ext4: Tamaño máximo de archivo de 16 tebibytes (TiB).

  • XFS: Tamaño máximo de archivo de 8 exbibytes (EiB).

Para escalar más allá de los límites del sistema de archivos o del hardware, MongoDB ofrece estrategias como la fragmentación, que permite que las colecciones crezcan indefinidamente. Para las colecciones que se acercan a estos límites o los cuellos de botella en el rendimiento, MongoDB recomienda la fragmentación o la migración a una configuración en clúster como MongoDB Atlas, que admite el escalado automático.

Al fragmentar una colección, MongoDB determina los rangos iniciales de fragmentos basándose en la clave de fragmentación y divide tus datos en fragmentos manejables. Estos límites solo afectan a la operación inicial de la fragmentación:

  • chunkSize (default: 128 MB).

  • Tamaño medio de la clave de fragmentación (el tamaño típico es de 16 bytes).

Tamaño del documento BSON

El tamaño máximo de un documento BSON es de 16 mebibytes.

El tamaño máximo de un documento ayuda a garantizar que un único documento no pueda utilizar una cantidad excesiva de RAM o, durante la transmisión, una cantidad excesiva de ancho de banda. Para almacenar documentos más grandes que el tamaño máximo, MongoDB proporciona la API de GridFS. Para obtener más información sobre GridFS, se debe consultar mongofiles y la documentación para el driver.

Profundidad de anidación para documentos BSON

MongoDB admite un máximo de 100 niveles de anidamiento para documentos BSON. Cada objeto o arreglo agrega un nivel.

Uso de mayusculas en nombres de bases de datos

No confíe en las mayúsculas para distinguir entre bases de datos. Por ejemplo, no puede utilizar dos bases de datos con nombres como salesData y SalesData.

Después de crear una base de datos en MongoDB, debes usar mayúsculas coherentes al referirse a ella. Por ejemplo, si creas la base de datos salesData, no la menciones utilizando mayúsculas alternativas, como salesdata o SalesData.

Restricciones en los nombres de bases de datos para Windows

Para las implementaciones de MongoDB que se ejecutan en Windows, los nombres de las bases de datos no pueden contener ninguno de los siguientes caracteres:

/\. "$*<>:|?

Además, los nombres de las bases de datos no pueden contener el carácter nulo.

Restricciones sobre los nombres de bases de datos para sistemas Unix y Linux

Para las implementaciones de MongoDB que se ejecutan en sistemas Unix y Linux, los nombres de las bases de datos no pueden contener ninguno de los siguientes caracteres:

/\. "$

Además, los nombres de las bases de datos no pueden contener el carácter nulo.

Longitud de los nombres de bases de datos

Los nombres de las bases de datos no pueden estar vacíos y deben tener menos de 64 bytes.

Restricción en los nombres de colección

Los nombres de las colecciones deben comenzar con un guion bajo o un carácter de letra, y no pueden:

  • contenga el $.

  • ser una string vacía (por ejemplo, "").

  • contiene el carácter null.

  • comience con el prefijo system.. (Reservado para uso interno.)

  • contiene .system..

Si el nombre de la colección incluye caracteres especiales, como el carácter de subrayado, o comienza con números, para acceder a la colección, se debe usar el método db.getCollection() en mongosh o un método similar para el driver.

Longitud del namespace:

El límite de longitud del espacio de nombres para colecciones y vistas no fragmentadas es de 255 bytes, y de 235 bytes para colecciones fragmentadas. Para una colección o vista, el espacio de nombres incluye el nombre de la base de datos, el punto (.) y el nombre de la colección/vista (p. ej., <database>.<collection>).

Restricciones en los nombres de campos
  • Los nombres de campo no pueden contener el caracter null.

  • El servidor permite el almacenamiento de nombres de campo que contienen puntos (.) y signos de dólar ($).

  • MongodB 5.0 ofrece un mejor soporte para el uso de ($) y (.) en los nombres de campo. Existen algunas restricciones. Consulta Consideraciones sobre los nombres de campo para obtener más detalles.

Restricciones en el campo _id

El nombre del campo _id está reservado para su uso como llave primaria; su valor debe ser único en la colección, es inmutable y puede ser de cualquier tipo que no sea un arreglo o una expresión regular. Si el _id contiene subcampos, los nombres de los subcampos no pueden comenzar con el símbolo ($).

Advertencia

Tenga precaución, los problemas tratados en esta sección podrían provocar pérdida o corrupción de datos.

El lenguaje del query de MongoDB no admite documentos con nombres de campo duplicados:

  • Aunque algunos desarrolladores de BSON pueden admitir la creación de un documento BSON con nombres de campos duplicados, la inserción de estos documentos en MongoDB no está permitida, incluso si la inserción tiene éxito o parece tener éxito.

  • Por ejemplo, insertar un documento BSON con nombres de campos duplicados a través de un controlador de MongoDB puede resultar en que el controlador descarte silenciosamente los valores duplicados antes de la inserción, o puede resultar en que se inserte un documento inválido que contenga campos duplicados. Realizar un query en esos documentos lleva a resultados inconsistentes.

  • No se admite la actualización de documentos con nombres de campos duplicados, incluso si la actualización tiene éxito o parece tener éxito.

A partir de MongoDB 6.1, para ver si un documento tiene nombres de campo duplicados, utiliza el comando validate con el campo full establecido en true. En cualquier versión de MongoDB, utiliza el operador de agregación $objectToArray para ver si un documento tiene nombres de campo duplicados.

No utilice un nombre de campo que sea igual a la notación de puntos para un campo incrustado. Si tiene un documento con un campo incrustado { "a" : { "b": ... } }, los demás documentos de esa colección no deben tener un campo de nivel superior "a.b".

Si puede referenciar un campo incrustado y un campo de nivel superior de la misma manera, las operaciones de indexación y fragmentación ocurren en el campo incrustado. No se puede indexar ni fragmentar en el campo de nivel superior "a.b" mientras la colección tiene un campo incrustado al que se hace referencia de la misma manera.

Por ejemplo, si su colección contiene documentos con un campo incrustado { "a" : { "b": ... } } y un campo de nivel superior "a.b", las operaciones de indexación y fragmentación ocurren en el campo incrustado. No es posible indexar o fragmentar en el campo de nivel superior "a.b" cuando su colección también contiene un campo incrustado { "a" : { "b": ... } }.

A partir de MongoDB 5.0, los nombres de los campos del documento pueden tener prefijo de dólar ($) y pueden contener puntos (.). Sin embargo, mongoimport y mongoexport pueden no funcionar como se espera en algunas situaciones con nombres de campos que utilizan estos caracteres.

MongoDB Extended JSON v2 no puede diferenciar entre los contenedores de tipo y los campos que tienen el mismo nombre que los contenedores de tipo. No utilices formatos JSON extendidos en contextos donde las representaciones BSON correspondientes puedan incluir claves con prefijo de dólar ($). El mecanismo DBRef es una excepción a esta regla general.

También hay restricciones en el uso de mongoimport y mongoexport con puntos (.) en los nombres de campo. Dado que los archivos CSV utilizan el punto (.) para representar jerarquías de datos, un punto (.) en el nombre de un campo se interpretará incorrectamente como un nivel de anidamiento.

Existe una pequeña posibilidad de pérdida de datos cuando se utilizan nombres de campo con el prefijo dólar ($) o nombres de campo que contienen puntos (.) si estos nombres de campo se utilizan junto con escrituras no reconocidas (nivel de confirmación de escritura w=0) en servidores que sean anteriores a MongoDB 5.0.

Al ejecutar los comandos insert, update y findAndModify, los controladores compatibles con la versión 5.0 eliminan las restricciones sobre el uso de documentos con nombres de campo que tengan el prefijo dólar ($) o que contengan puntos (.). Estos nombres de campo generaban un error del lado del cliente en versiones anteriores del controlador.

Las restricciones se eliminan independientemente de la versión del servidor a la que esté conectado el controlador. Si un controlador 5.0 envía un documento a un servidor más antiguo, el documento será rechazado sin enviar un error.

Longitud del namespace

El límite de longitud del espacio de nombres para colecciones y vistas no fragmentadas es de 255 bytes, y de 235 bytes para colecciones fragmentadas. Para una colección o vista, el espacio de nombres incluye el nombre de la base de datos, el punto (.) y el nombre de la colección/vista (p. ej., <database>.<collection>).

Tip

Número de índices por colección

Una sola colección puede tener como máximo 64 índices.

Número de campos indexados en un índice compuesto

No puede haber más de 32 campos en un índice compuesto.

Las consultas no pueden utilizar índices geoespaciales y de texto

No se puede combinar la query $text, la cual requiere un índice de texto especial, con un operador de la query que requiere un tipo diferente de índice especial. Por ejemplo, no se puede combinar la query $text con el operador $near.

Los campos con índices de 2dsphere solo pueden contener geometrías

Los campos con índices 2dsphere deben contener datos geométricos en forma de pares de coordenadas o datos GeoJSON. Si intentas insertar un documento con datos no geométricos en un campo indexado 2dsphere, o compilar un índice 2dsphere en una colección donde el campo indexado tenga datos no geométricos, la operación fallará.

Tip

El límite de índices únicos en Restricciones operativas de fragmentación.

Número limitado de claves de índice 2dsphere

Para generar claves para un índice 2dsphere, mongod asigna formas GeoJSON a una representación interna. La representación interna resultante puede ser un gran arreglo de valores.

Cuando mongod genera claves de índice en un campo que contiene un arreglo, mongod genera una clave de índice para cada elemento del arreglo. Para los índices compuestos, mongod calcula el producto cartesiano de los conjuntos de claves que se generan para cada campo. Si ambos conjuntos son grandes, entonces calcular el producto cartesiano podría hacer que la operación exceda los límites de memoria.

indexMaxNumGeneratedKeysPerDocument limita el número máximo de claves generadas para un solo documento para prevenir errores de memoria insuficiente. El valor por defecto es de 100 000 claves de índice por documento. Es posible aumentar el límite, pero si una operación requiere más claves de las que el parámetro indexMaxNumGeneratedKeysPerDocument especifica, la operación fallará.

Los valores NaN devueltos por query cubiertos por el motor de almacenamiento WiredTiger siempre son de tipo double

Si el valor de un campo devuelto de una query que está cubierta por un índice es NaN, el tipo de ese valor NaN es siempre double.

Multikey Index

Los índices de múltiples claves no pueden cubrir queries sobre campos de arreglos.

Índice geoespacial

Los índices geoespaciales no pueden cubrir una query.

Uso de memoria en la creación de índices

createIndexes brinda soporte a la creación de uno o más índices en una colección. createIndexes utiliza una combinación de memoria y archivos temporales en disco para crear índices. El límite de memoria por defecto es de 200 megabytes por comando createIndexes, compartido equitativamente entre toda la creación de índices en ese comando. Por ejemplo, si se crean 10 índices con un comando createIndexes, MongoDB asigna a cada índice 20 megabytes para el proceso de creación de índices cuando se utiliza el límite de memoria por defecto de 200. Cuando se alcanza el límite de memoria, MongoDB crea archivos temporales en el subdirectorio _tmp dentro de --dbpath para completar la compilación.

Ajuste el límite de memoria con el parámetromaxIndexBuildMemoryUsageMegabytes. Aumentar este parámetro solo es necesario en casos excepcionales, como al ejecutar varias compilaciones de índices simultáneas con un solo comandocreateIndexeso al indexar un conjunto de datos de más de 500GB.

Cada createIndexes comando tiene un límite de maxIndexBuildMemoryUsageMegabytes. Al utilizar el valor maxNumActiveUserIndexBuilds por defecto de 3, el uso total de memoria para todas las creaciones de índices simultáneas puede alcanzar hasta 3 veces el valor de maxIndexBuildMemoryUsageMegabytes.

El límite maxIndexBuildMemoryUsageMegabytes se aplica a todas las creaciones de índices iniciadas por comandos de usuario como createIndexes o procesos administrativos como la sincronización inicial.

Una sincronización inicial llena solo una colección a la vez y no corre ningún riesgo de exceder el límite de memoria. Sin embargo, es posible que un usuario inicie la creación de índices en múltiples colecciones en varias bases de datos simultáneamente.

Tipos de intercalación y de índices

Los siguientes tipos de índice solo tienen soporte para la comparación binaria simple y no tienen soporte para la intercalación:

Tip

Para crear un índice text o 2d en una colección que tenga una intercalación no simple, debe especificar explícitamente {collation: {locale: "simple"} } al crear el índice.

Hidden Indexes
Máximo número de claves de clasificación
  • Puedes ordenar sobre un máximo de 32 claves.

  • Proveer un patrón de ordenación con campos duplicados causa un error.

Máxima número de documentos en una colección con tamaño fijo

Si especifica el número máximo de documentos en una colección con tamaño fijo usando el parámetro max de create, el valor debe ser inferior a 2 31 documentos.

Si no especifica un número máximo de documentos al crear una colección con tamaño fijo, no hay límite en la cantidad de documentos.

Cantidad de nodos de un set de réplicas

Los sets de réplicas pueden tener hasta 50 nodos.

Número de nodos con derecho a voto de un set de réplicas

Los sets de réplicas pueden tener hasta siete miembros con derecho a voto. Para sets de réplicas con más de siete miembros en total, consulta Miembros sin derecho a voto.

Tamaño máximo del Oplog creado automáticamente

Si no especifica explícitamente un tamaño de oplog (es decir, con oplogSizeMB o --oplogSize), MongoDB creará un oplog que no supere los 50 gigabytes. [4]

[4] El oplog puede crecer más allá de su límite de tamaño configurado para evitar borrar el majority commit point.

Los clústeres fragmentados tienen las restricciones y los umbrales que se describen aquí.

Operaciones no disponibles en entornos fragmentados

$where no permite referencias al objeto db desde la función $where. Esto es poco común en colecciones no particionadas.

Queries cubiertos en clústeres fragmentados

Cuando se ejecutan en mongos, los índices solo pueden cubrir las query sobre colecciones fragmentadas si el índice contiene la clave de fragmentación.

Operaciones de modificación de un solo documento en colecciones fragmentadas

Para utilizar las operaciones update y remove() en una colección particionada que especifique la opción justOne o multi: false:

  • Si solo apunta a un fragmento, puede usar una clave de fragmentación parcial en la especificación de query o,

  • Puede proporcionar la clave de fragmentación o el campo _id en la especificación de la query.

Índices únicos en colecciones fragmentadas

MongoDB no admite índices únicos entre fragmentos, excepto cuando el índice único contiene la clave de fragmentación completa como prefijo del índice. En estas situaciones, MongoDB aplicará la unicidad en toda la clave, no en un solo campo.

Tip

Consulte:

Restricciones únicas en campos arbitrarios para un enfoque alternativo.

Cantidad máxima de documentos por rango para migrar

Por defecto, MongoDB no puede mover un rango si el número de documentos en el rango es mayor que 2 veces el resultado de dividir el tamaño del rango configurado por el tamaño promedio de los documentos. Si MongoDB puede mover un subrango de un fragmento y reducir su tamaño a menos de eso, el balanceador lo hace migrando un rango. db.collection.stats() incluye el campo avgObjSize, que representa el tamaño medio de los documentos en la colección.

Para fragmentos que son demasiado grandes para migrar:

  • La configuración del balanceador attemptToBalanceJumboChunks permite que el balanceador migre fragmentos demasiado grandes para mover, siempre que los fragmentos no estén etiquetados como jumbo. Consulte los rangos de balance que exceden el límite de tamaño para obtener más detalles.

    Al emitir los comandos moveRange y moveChunk, es posible especificar la opción forceJumbo para permitir la migración de rangos que son demasiado grandes para moverse. Los rangos pueden o no estar etiquetados como jumbo.

Tipo de índice de clave de fragmentación

Un índice de clave de fragmentación puede ser un índice ascendente en la clave de fragmentación, un índice compuesto que comienza con la clave de fragmentación y especifica el orden ascendente para la clave de fragmentación, o un índice encriptado.

Un índice de clave de fragmentación no puede ser:

Selección de Shard Key

Las opciones para cambiar una clave de partición dependen de la versión de MongoDB que está ejecutando:

Las claves de fragmentación que aumentan de manera monótona pueden limitar el rendimiento de inserción

Para los clústeres con volúmenes de inserción altos, una clave de fragmentación con claves que aumentan o disminuyen de manera monótona puede afectar el rendimiento de inserción. Si la clave de fragmentación es el campo _id, se debe tener en cuenta que los valores por defecto de los campos _id son ObjectIds que generalmente tienen valores crecientes.

Al insertar documentos con claves de fragmentación que aumentan de forma monótona, todas las inserciones pertenecen al mismo fragmento en una sola partición. El sistema eventualmente divide el rango de fragmentos que recibe todas las operaciones de guardado y migra su contenido para distribuir los datos de manera más uniforme. Sin embargo, en cualquier momento, el clúster dirige las operaciones de inserción únicamente a una partición, lo que crea un cuello de botella en el rendimiento de inserción.

Si las operaciones en el clúster son predominantemente de lectura y actualizaciones, esta limitación puede no afectar al clúster.

Para evitar esta restricción, usa una clave de fragmentación encriptada o selecciona un campo que no aumente ni disminuya de forma monótona.

Claves de partición con hash y índices encriptados almacenan hashes de claves con valores ascendentes.

Operaciones de clasificación

Si MongoDB no puede utilizar un índice o índices para obtener el orden de clasificación, MongoDB debe realizar una operación de clasificación en memoria sobre los datos.

Para obtener más información sobre la ordenación y el uso de índices, consulta Uso de la ordenación y el índice.

Etapas de la pipeline de agregación

MongoDB limita el número de etapas de la canalización de agregación permitidas en un solo pipeline a 1000.

Si un pipeline de agregación supera el límite de etapa antes o después de ser analizada, se recibe un error.

Memoria de pipeline de agregación

A partir de MongoDB 6.0, el parámetro allowDiskUseByDefault controla si las etapas del pipeline que requieren más de 100 megabytes de memoria para ejecutarse guardan archivos temporales en disco por defecto.

  • Si allowDiskUseByDefault se establece en true, las etapas del pipeline que requieren más de 100 megabytes de memoria para ejecutarse guardan archivos temporales en el disco por defecto. Puedes desactivar la escritura de archivos temporales en el disco para comandos específicos find o aggregate utilizando la opción { allowDiskUse: false }.

  • Si allowDiskUseByDefault se establece en false, las etapas de la pipeline que requieren más de 100 megabytes de memoria para ejecutarse generan un error por defecto. Puedes habilitar la escritura de archivos temporales en disco para find o aggregate específicos usando la opción { allowDiskUse: true }.

La $search etapa de agregación no está restringida a 100 megabytes de RAM porque se ejecuta en un proceso separado.

Estos son algunos ejemplos de las etapas que pueden guardar archivos temporales en el disco cuando allowDiskUse está en true:

Nota

Las etapas del pipeline operan en flujos de documentos, donde cada etapa del pipeline toma documentos, realizando su procesamiento y luego produciendo los documentos resultantes.

Algunas etapas no pueden generar ningún documento hasta que hayan procesado todos los documentos entrantes. Estas etapas del pipeline deben mantener su salida en la RAM hasta que se procesen todos los documentos entrantes. Como resultado, estas etapas de la pipeline pueden requerir más espacio que el límite de 100 MB.

Si los resultados de una de las etapas del pipeline $sort exceden el límite, se debe considerar agregar una etapa $limit.

Los mensajes de registro del perfilador y los mensajes de registro de diagnóstico incluyen un indicador usedDisk si alguna etapa de agregación escribió datos en archivos temporales debido a restricciones de memoria.

Agregación y nivel de consistencia de lectura
Las query geoespaciales 2d no pueden utilizar el operador $or
Query geoespacial

Utilizar un índice 2d para queries sobre datos esféricos puede devolver resultados incorrectos o un error. Por ejemplo, los índices 2d no admiten "queries" esféricas que envuelven los polos.

Coordenadas geoespaciales
  • Los valores de longitud válidos están entre -180 y 180, ambos inclusive.

  • Los valores de latitud válidos están entre -90 y 90, ambos inclusive.

Área de polígonos de GeoJSON

Para $geoIntersects o $geoWithin, si especificas un polígono de un solo anillo que tiene un área mayor que un solo hemisferio, incluye el sistema de referencia de coordenadas personalizado de MongoDB en la expresión $geometry. De lo contrario, las query $geoIntersects o $geoWithin para la geometría complementaria. Para todos los demás polígonos GeoJSON con áreas mayores que un hemisferio, las query $geoIntersects o $geoWithin para la geometría complementaria.

Transacciones multidocumento

Para transacciones multidocumento:

  • Puede crear colecciones e índices en transacciones. Para más información, consulte Crear colecciones e índices en una transacción.

  • Las colecciones utilizadas en una transacción pueden encontrarse en diferentes bases de datos.

    Nota

    No puedes crear nuevas colecciones en transacciones de escritura entre particiones. Por ejemplo, si guardas en una colección existente en una partición y creas implícitamente una colección en una partición diferente, MongoDB no puede realizar ambas operaciones en la misma transacción.

  • No se puede escribir en colecciones con tamaño fijo.

  • No puedes usar el nivel de consistencia de lectura "snapshot" al leer de una colección con tamaño fijo. (A partir de MongoDB 5.0)

  • No puedes leer ni escribir en colecciones en las bases de datos config, admin o local.

  • No se puede escribir en las colecciones de system.*.

  • No puedes devolver el plan de query de las operaciones admitidas usando explain o comandos similares.

  • Para los cursores creados fuera de una transacción, no puedes llamar a getMore dentro de la transacción.

  • Para los cursores creados en una transacción, no puedes llamar a getMore fuera de la transacción.

  • No puede especificar el comando killCursors como la primera operación en una transacción.

    Además, si ejecutas el comando killCursors dentro de una transacción, el servidor detiene inmediatamente los cursores especificados. No espera la confirmación de la transacción.

Las siguientes operaciones no están permitidas en las transacciones:

Las transacciones tienen un límite de tiempo de vida según lo especificado por transactionLifetimeLimitSeconds. El valor por defecto es 60 segundos.

Límite de tamaño de la agrupación del comando de escritura

Aunque MongoDB no tiene un límite en la cantidad de operaciones agrupadas que puede realizar, permite un máximo de 100,000 acciones de escritura en una sola operación agrupada. Un solo agrupamiento representa una única solicitud al servidor. Si la cantidad de acciones de escritura en una operación agrupada excede 100.000, el controlador del cliente divide el agrupamiento en grupos más pequeños con conteos menores o iguales a 100.000.

Vistas

Una definición de vista pipeline no puede incluir la etapa $out o la $merge. Esta restricción también se aplica a pipelines integradas, como las pipelines usadas en las etapas de $lookup o $facet.

Las vistas tienen las siguientes restricciones de operación:

Restricciones de proyecciones
$-Restricción de la ruta de campo con prefijo
La proyección de find() y de findAndModify() no pueden proyectar un campo que comience con $, con la excepción de los campos DBRef.Por ejemplo, la siguiente operación es inválida:
db.inventory.find( {}, { "$instock.warehouse": 0, "$item": 0, "detail.$price": 1 } )
$ Restricción de colocación de operadores posicionales
El operador de proyección $ solo puede aparecer al final de la ruta de campo, por ejemplo "field.$" o "fieldA.fieldB.$". Por ejemplo, la siguiente operación no es válida:
db.inventory.find( { }, { "instock.$.qty": 1 } )
Para resolver, elimine el componente de la ruta de campo que sigue al operador de proyección $.
Restricción de proyección de nombre de campo vacío
La proyección find() y la proyección findAndModify() no pueden incluir una proyección de un nombre de campo vacío. Por ejemplo, la siguiente operación es inválida:
db.inventory.find( { }, { "": 0 } )
En versiones anteriores, MongoDB trata la inclusión/exclusión del campo vacío de la misma manera que la proyección de campos inexistentes.
Colisión de ruta: Documentos incrustados y sus campos
No puedes proyectar un documento incrustado con ninguno de los campos del documento incrustado. Por ejemplo, considera una colección inventory con documentos que contienen un campo size:
{ ..., size: { h: 10, w: 15.25, uom: "cm" }, ... }
La siguiente operación falla con un error de Path collision porque intenta proyectar tanto el documento size como el campo size.uom:
db.inventory.find( {}, { size: 1, "size.uom": 1 } )
En versiones anteriores, la última proyección entre los documentos incrustados y sus campos determinaba la proyección:
  • Si la proyección del documento incrustado viene después de todas y cada una de las proyecciones de sus campos, MongoDB proyecta el documento incrustado. Por ejemplo, el documento de proyección { "size.uom": 1, size: 1 } produce el mismo resultado que el documento de proyección { size: 1 }.

  • Si la proyección del documento incrustado se realiza antes que la de cualquiera de sus campos, MongoDB proyecta el campo o los campos especificados. Por ejemplo, el documento de proyección { "size.uom": 1, size: 1, "size.h": 1 } produce el mismo resultado que el documento de proyección { "size.uom": 1, "size.h": 1 }.

Colisión de ruta: $slice de un arreglo y campos embebidos
find() y la proyección findAndModify() no pueden contener a la vez un $slice de un arreglo y un campo incrustado en el arreglo. Por ejemplo, considere una colección inventory que contiene un campo de arreglo instock:
{ ..., instock: [ { warehouse: "A", qty: 35 }, { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ], ... }
La siguiente operación falla con un error Path collision:
db.inventory.find( {}, { "instock": { $slice: 1 }, "instock.warehouse": 0 } )
En versiones anteriores, la proyección aplicaba ambas proyecciones y devolvía el primer elemento ($slice: 1) del arreglo instock, pero suprimía el campo warehouse en el elemento proyectado. A partir de MongoDB 4.4, para lograr el mismo resultado, utiliza el método db.collection.aggregate() con dos etapas $project separadas.
$ Operador posicional y restricción de $slice
Las proyecciones find() y findAndModify() no pueden incluir la expresión de proyección $slice como parte de una expresión de proyección $. Por ejemplo, la siguiente operación no es válida:
db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } )
En versiones anteriores, MongoDB devuelve el primer elemento (instock.$) del arreglo instock que coincide con la condición de query; es decir, la proyección posicional "instock.$" tiene prioridad y la $slice:1 no realiza ninguna operación. El "instock.$": { $slice: 1 } no excluye ningún otro campo del documento.
Límite de sesiones y nombre de usuario $external

Para usar sesiones de cliente y garantías de coherencia causal con usuarios de autenticación $external (usuarios Kerberos, LDAP o X.509), los nombres de usuario no pueden superar los 10k bytes.

Tiempo de espera de inactividad de la sesión

Las sesiones que no reciben operaciones de lectura o escritura durante 30 minutos o que no se actualizan usando refreshSessions dentro de este umbral, son marcadas como expiradas y el servidor MongoDB puede cerrarlas en cualquier momento. Cerrar una sesión termina cualquier operación en curso y los cursores abiertos asociados con la sesión. Esto incluye cursores configurados con noCursorTimeout() o un maxTimeMS() mayor de 30 minutos.

Considera una aplicación que emite un db.collection.find(). El servidor devuelve un cursor junto con un lote de documentos definidos por la cursor.batchSize() del find(). La sesión se actualiza cada vez que la aplicación realiza una solicitud de un nuevo agrupamiento de documentos del servidor. Sin embargo, si la aplicación tarda más de 30 minutos en procesar el lote actual de documentos, la sesión se marca como expirada y se cierra. Cuando la aplicación solicita el siguiente lote de documentos, el servidor arroja un error porque el cursor se eliminó al cerrar la sesión.

Para las operaciones que devuelven un cursor, si el cursor puede estar inactivo durante más de 30 minutos, emite la operación dentro de una sesión explícita utilizando Mongo.startSession() y actualiza periódicamente la sesión utilizando el comando refreshSessions. Por ejemplo:

var session = db.getMongo().startSession()
var sessionId = session
sessionId // show the sessionId
var cursor = session.getDatabase("examples").getCollection("data").find().noCursorTimeout()
var refreshTimestamp = new Date() // take note of time at operation start
while (cursor.hasNext()) {
// Check if more than 5 minutes have passed since the last refresh
if ( (new Date()-refreshTimestamp)/1000 > 300 ) {
print("refreshing session")
db.adminCommand({"refreshSessions" : [sessionId]})
refreshTimestamp = new Date()
}
// process cursor normally
}

En la operación de ejemplo, el método db.collection.find() está asociado con una sesión explícita. El cursor está configurado con noCursorTimeout() para evitar que el servidor cierre el cursor si está inactivo. El bucle while incluye un bloque que utiliza refreshSessions para refrescar la sesión cada 5 minutos. Dado que la sesión nunca superará el tiempo de espera de inactividad de 30 minutos, el cursor puede permanecer abierto indefinidamente.

Para los controladores de MongoDB, consulta la documentación del controlador para obtener instrucciones y la sintaxis para crear sesiones.

Volver

Mensajes de registro

En esta página