Este documento proporciona una colección de limitaciones estrictas y flexibles del sistema MongoDB. Las limitaciones en esta página se aplican a las implementaciones alojadas en todos los entornos siguientes, a menos que se indique lo contrario:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Limitaciones de MongoDB Atlas
Las siguientes limitaciones se aplican únicamente a las implementaciones alojadas en MongoDB Atlas. Si alguno de estos límites representa un problema para la organización, se debe contactar a soporte de Atlas.
Límites del clúster de MongoDB Atlas
Componente | Limit |
|---|---|
Particiones en clústeres multirregionales | 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) |
|
Límites de conexión y nivel de clúster de MongoDB Atlas
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 |
|---|---|
| 500 |
| 500 |
| 1500 |
| 3000 |
| 3000 |
| 6000 |
| 16000 |
| 32000 |
| 96000 |
| 96000 |
| 128000 |
| 128000 |
MongoDB Atlas Cluster Tier | Conexiones máximas por nodo |
|---|---|
| 4000 |
| 16000 |
| 32000 |
| 64000 |
| 96000 |
| 128000 |
| 128000 |
| 128000 |
| 128000 |
MongoDB Atlas Cluster Tier | Conexiones máximas por nodo |
|---|---|
| 500 |
| 500 |
| 1500 |
| 3000 |
| 3000 |
| 6000 |
| 16000 |
| 32000 |
| 64000 |
| 96000 |
| 128000 |
| 128000 |
Nota
MongoDB Atlas reserva una pequeña cantidad de conexiones a cada clúster para soportar los servicios de MongoDB Atlas.
Limites de conexión multi-nube 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.
Límites de colecciones e índices de MongoDB Atlas
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 |
|---|---|
| 5000 colecciones e índices |
| 10 000 colecciones e índices |
| 100 000 colecciones e índices |
Límites de la organización y del proyecto de MongoDB Atlas
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. |
| 1 |
Límites de la cuenta de servicio de MongoDB Atlas
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 |
Límites para etiquetas de MongoDB Atlas
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] |
|
Nombre del proyecto | 64 |
|
Nombre de la organización | 64 |
|
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: -_.(),:&@+'. |
Limitaciones del clúster gratuito y del clúster flexible
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:
Limitaciones de comandos de MongoDB Atlas
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:
Documentos BSON
- 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
mongofilesy 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.
Restricciones de denominación
- 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
salesDataySalesData.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, comosalesdataoSalesData.
- 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()enmongosho 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
_idestá 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_idcontiene subcampos, los nombres de los subcampos no pueden comenzar con el símbolo ($).
Advertencias de nombres
Advertencia
Tenga precaución, los problemas tratados en esta sección podrían provocar pérdida o corrupción de datos.
MongoDB no admite nombres de campo duplicados
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.
Evite nombres de campos ambiguos
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": ... } }.
Preocupaciones sobre importación y exportación con signos$ de dólar () y puntos. ()
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.
Posible pérdida de datos con signos de dólar ($) y puntos (.)
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 5.0 compatibles con eliminan las restricciones sobre el uso de documentos con nombres de campo con el$ prefijo dólar () o puntos. (). Estos nombres de campo generaban un error en el 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.
Namespaces
- 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>).
Indexes
- 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$textcon 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 índice2dsphereen 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,
mongodasigna formas GeoJSON a una representación interna. La representación interna resultante puede ser un gran arreglo de valores.Cuando
mongodgenera claves de índice en un campo que contiene un arreglo,mongodgenera una clave de índice para cada elemento del arreglo. Para los índices compuestos,mongodcalcula 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.indexMaxNumGeneratedKeysPerDocumentlimita 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ámetroindexMaxNumGeneratedKeysPerDocumentespecifica, 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 valorNaNes siempredouble.
- Multikey Index
Índices multiclave no pueden cubrir consultas sobre campos de arreglos.
- Índice geoespacial
Los índices geoespaciales no pueden cubrir una query.
- Uso de memoria en la creación de índices
createIndexespermite la creación de uno o más índices en una colección.createIndexesutiliza una combinación de memoria y archivos temporales en disco para completar la creación de índices. El límite predeterminado de uso de memoria para escreateIndexesde 200 megabytes, compartidos entre todos los índices creados con un únicocreateIndexescomando. Una vez alcanzado el límite de memoria, utiliza archivoscreateIndexestemporales de disco en un subdirectorio llamado_tmpdentro del--dbpathdirectorio para completar la creación.Puede anular el límite de memoria configurando el
maxIndexBuildMemoryUsageMegabytesparámetro de servidor. Un límite de memoria más alto puede resultar en una compilación de índices más rápida. Sin embargo, si este límite es demasiado alto en relación con la RAM no utilizada del sistema, puede provocar el agotamiento de la memoria y el apagado del servidor.Para la versión de compatibilidad de funciones (fcv)
"4.2"y posteriores, el límite de memoria de compilación de índice se aplica a todas las compilaciones de índice.
La creación de índices puede iniciarse mediante un comando de usuario, como "Crear índice", o mediante un proceso administrativo, como una sincronización inicial. Ambos están sujetos al límite establecido
maxIndexBuildMemoryUsageMegabytespor.Una operación de sincronización inicial rellena solo una colección a la vez y no existe riesgo de exceder el límite de memoria. Sin embargo, es posible que un usuario inicie compilaciones de índices en varias colecciones de varias bases de datos simultáneamente y potencialmente consuma una cantidad de memoria superior al límite establecido
maxIndexBuildMemoryUsageMegabytesen.Tip
Para minimizar el impacto de la creación de un índice en conjuntos de réplicas y clústeres fragmentados con fragmentos de conjuntos de réplicas, utilice un procedimiento de creación de índice continuo como se describe en Creaciones de índice continuo en conjuntos de réplicas.
Advertencia
Evita realizar procesos de creación de índices en modo continuo y replicado al mismo tiempo, ya que podría generar problemas inesperados, como compilaciones fallidas y bucles de fallos.
- 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,2dogeoHaystacken una colección que tiene una intercalación no simple, debe especificar explícitamente{collation: {locale: "simple"} }al crear el índice.
- Hidden Indexes
No puedes ocultar el índice
_id.No puedes usar
hint()en un índice oculto.
Ordena
Datos
- 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
maxdecreate, 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.
Sets de réplicas
- 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
oplogSizeMBo--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.
Clústeres fragmentados
Los clústeres fragmentados tienen las restricciones y los umbrales que se describen aquí.
Restricciones operativas de particionado
- Operaciones no disponibles en entornos fragmentados
$whereno permite referencias al objetodbdesde 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
updateyremove()en una colección particionada que especifique la opciónjustOneomulti: 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
_iden 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.
- 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 campoavgObjSize, 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
attemptToBalanceJumboChunkspermite 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
moveRangeymoveChunk, 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.
Limitaciones de la clave de fragmentación
- 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:
Un índice descendente en la clave de fragmentación
Cualquiera de los siguientes tipos de índices:
- Selección de Shard Key
Las opciones para cambiar una clave de partición dependen de la versión de MongoDB que está ejecutando:
A partir de MongoDB 5.0, puedes refragmentar una colección al cambiar la clave de fragmentación de un documento.
Para ajustar una clave de fragmentación, agrega un campo o campos de sufijo a la clave de fragmentación existente.
- 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_idson 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
- 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
allowDiskUseByDefaultcontrola si las etapas del pipeline que requieren más de 100 megabytes de memoria para ejecutarse guardan archivos temporales en disco por defecto.Si
allowDiskUseByDefaultse establece entrue, 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íficosfindoaggregateutilizando la opción{ allowDiskUse: false }.Si
allowDiskUseByDefaultse establece enfalse, 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 parafindoaggregateespecíficos usando la opción{ allowDiskUse: true }.
La
$searchetapa 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:$sortcuando la operación de ordenación no está soportada por un índice
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
$sortexceden 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
usedDisksi alguna etapa de agregación escribió datos en archivos temporales debido a restricciones de memoria.
- Agregación y nivel de consistencia de lectura
La etapa
$outno se puede usar junto con el nivel de consistencia de lectura"linearizable". Si especificas"linearizable"nivel de consistencia de lectura paradb.collection.aggregate(), no podrás incluir la etapa$outen la pipeline.La etapa
$mergeno se puede usar junto con el nivel de consistencia de lectura"linearizable". Es decir, si especificas el"linearizable"nivel de consistencia de lectura paradb.collection.aggregate(), no puedes incluir la etapa$mergeen la pipeline.
- Query geoespacial
Para consultas esféricas, utilice el resultado del índice
2dsphere.El uso del índice
2dpara consultas esféricas puede generar resultados incorrectos, como el uso del índice2dpara consultas esféricas que envuelven los polos.
- Coordenadas geoespaciales
Los valores de longitud válidos están entre
-180y180, ambos inclusive.Los valores de latitud válidos están entre
-90y90, ambos inclusive.
- Área de polígonos de GeoJSON
Para
$geoIntersectso$geoWithin, si especifica un polígono de un solo anillo con un área mayor que un hemisferio, incluya la expresiónthe custom MongoDB coordinate reference system in the $geometry; de lo contrario,$geoIntersectso$geoWithinconsultas para la geometría complementaria. Para todos los demás polígonos GeoJSON con áreas mayores que un hemisferio,$geoIntersectso$geoWithinconsultas 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,adminolocal.No se puede escribir en las colecciones de
system.*.No puedes devolver el plan de query de las operaciones admitidas usando
explaino comandos similares.
Para los cursores creados fuera de una transacción, no puedes llamar a
getMoredentro de la transacción.Para los cursores creados en una transacción, no puedes llamar a
getMorefuera de la transacción.
No puede especificar el comando
killCursorscomo la primera operación en una transacción.Además, si ejecutas el comando
killCursorsdentro 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:
Creación de nuevas colecciones en transacciones de escritura entre particiones. Por ejemplo, si usted guarda en una colección existente en una partición y crea implícitamente una colección en una partición diferente, MongoDB no puede realizar ambas operaciones en la misma transacción.
Creación explícita de colecciones, como por ejemplo: Método
db.createCollection()e índices, por ejemplo: los métodosdb.collection.createIndexes()ydb.collection.createIndex(), cuando se utiliza un nivel de consistencia de lectura distinto de"local".Los comandos
listCollectionsylistIndexesy sus métodos asistentes.Otras operaciones que no son CRUD ni informativas, tales como
createUser,getParameter,count, etc. y sus asistentes.
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
pipelineno puede incluir la etapa$outo la$merge. Esta restricción también se aplica a pipelines integradas, como las pipelines usadas en las etapas de$lookupo$facet.Las vistas tienen las siguientes restricciones de operación:
Las vistas son de solo lectura.
No puede cambiar el nombre de vistas.
find()Las operaciones en las vistas no admiten los siguientes operadores de proyección:Las vistas no son compatibles con
$text.Las vistas no dan soporte a operaciones de map-reduce.
- Restricciones de proyecciones
$-Restricción de la ruta de campo con prefijo- La proyección de
find()y defindAndModify()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:Para resolver, elimine el componente de la ruta de campo que sigue al operador de proyeccióndb.inventory.find( { }, { "instock.$.qty": 1 } ) $. - Restricción de proyección de nombre de campo vacío
- La proyección
find()y la proyecciónfindAndModify()no pueden incluir una proyección de un nombre de campo vacío. Por ejemplo, la siguiente operación es inválida: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.db.inventory.find( { }, { "": 0 } ) - 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
inventorycon documentos que contienen un camposize:La siguiente operación falla con un error de{ ..., size: { h: 10, w: 15.25, uom: "cm" }, ... } Path collisionporque intenta proyectar tanto el documentosizecomo el camposize.uom:En versiones anteriores, la última proyección entre los documentos incrustados y sus campos determinaba la proyección:db.inventory.find( {}, { size: 1, "size.uom": 1 } ) 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:
$slicede un arreglo y campos embebidos find()y la proyecciónfindAndModify()no pueden contener a la vez un$slicede un arreglo y un campo incrustado en el arreglo. Por ejemplo, considere una coleccióninventoryque contiene un campo de arregloinstock:La siguiente operación falla con un error{ ..., instock: [ { warehouse: "A", qty: 35 }, { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ], ... } Path collision:En versiones anteriores, la proyección aplicaba ambas proyecciones y devolvía el primer elemento (db.inventory.find( {}, { "instock": { $slice: 1 }, "instock.warehouse": 0 } ) $slice: 1) del arregloinstock, pero suprimía el campowarehouseen el elemento proyectado. A partir de MongoDB 4.4, para lograr el mismo resultado, utiliza el métododb.collection.aggregate()con dos etapas$projectseparadas.$Operador posicional y restricción de$slice- Las proyecciones
find()yfindAndModify()no pueden incluir la expresión de proyección$slicecomo parte de una expresión de proyección$. Por ejemplo, la siguiente operación no es válida:En versiones anteriores, MongoDB devuelve el primer elemento (db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } ) instock.$) del arregloinstockque coincide con la condición de query; es decir, la proyección posicional"instock.$"tiene prioridad y la$slice:1no realiza ninguna operación. El"instock.$": { $slice: 1 }no excluye ningún otro campo del documento.
Sesiones
- 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
refreshSessionsdentro 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 connoCursorTimeout()o unmaxTimeMS()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 lacursor.batchSize()delfind(). 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 comandorefreshSessions. 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 connoCursorTimeout()para evitar que el servidor cierre el cursor si está inactivo. El buclewhileincluye un bloque que utilizarefreshSessionspara 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.