Overview
Las colecciones limitadas son colecciones de tamaño fijo que admiten operaciones de alto rendimiento que insertan y recuperan documentos según el orden de inserción. Las colecciones limitadas funcionan de manera similar a los búferes circulares: una vez que una colección llena su espacio asignado, hace espacio para nuevos documentos sobrescribiendo los documentos más antiguos en la colección.
Ver createCollection() o create para obtener más información sobre la creación de colecciones con límite de documento.
Tip
Como alternativa a las colecciones limitadas, considere los índices TTL de MongoDB (tiempo de vida). Como se describe en Expirar datos de colecciones configurando TTL, estos índices te permiten eliminar y remover datos de colecciones normales en función del valor de un campo de tipo fecha y de un valor TTL para el índice.
Los índices TTL no son compatibles con las colecciones con tamaño fijo.
Comportamiento
Orden de inserción
Las colecciones con tamaño fijo garantizan la preservación del orden de inserción. Como resultado, las queries no requieren un índice para devolver documentos en el orden de inserción. Sin esta sobrecarga de indexación, las colecciones con tamaño fijo pueden soportar un mayor rendimiento de inserciones.
Eliminación automática de documentos más antiguos
Para hacer espacio para nuevos documentos, las colecciones limitadas eliminan automáticamente los documentos más antiguos de la colección sin requerir scripts ni operaciones explícitas de eliminación.
Considera los siguientes casos de uso potenciales para las colecciones con límite:
Almacenar la información de registro generada por sistemas de alto volumen. Insertar documentos en una colección limitada sin índice es similar a escribir la información de registro directamente en un sistema de archivos. Además, la propiedad integrada "primero en entrar,primero en salir" mantiene el orden de los eventos y gestiona el uso del almacenamiento. Por ejemplo, el registro de operaciones utiliza una colección limitada.
Almacenar pequeñas cantidades de datos en colecciones limitadas. Dado que los caches son más de lectura que de escritura, habría que asegurarse de que esta colección siempre permanezca en el conjunto de trabajo (es decir, en RAM) o aceptar alguna penalización de escritura para el índice o los índices requeridos.
Colección de oplog
La colección oplog.rs que almacena un registro de las operaciones en un Set de réplicas utiliza una colección con tamaño fijo.
A partir de MongoDB 4.0, a diferencia de otras colecciones limitadas, el oplog puede crecer más allá de su límite de tamaño configurado para evitar majority
commit point eliminar.
Nota
MongoDB redondea el tamaño limitado de oplog al múltiplo entero más cercano de 256 bytes.
_id Index
Las colecciones con tamaño fijo tienen un campo _id y un índice en el campo _id de forma predeterminada.
Restricciones y recomendaciones
Lecturas
A partir de MongoDB 5.0, no se puede usar "snapshot" el nivel de consistencia de lectura cuando se lee de una colección con tamaño fijo.
Updates
Si planeas actualizar documentos en una colección con tamaño fijo, crea un índice para que estas operaciones de actualización no requieran un escaneo de colección.
particionado
No puedes fragmentar una colección con tamaño fijo.
Eficiencia en la query
Utiliza el ordenamiento natural para recuperar los elementos más recientemente insertados de la colección de manera eficiente. Esto es similar a usar el comando tail en una entrada de registro.
Agregación $out
La etapa de canalización de agregación no puede escribir resultados en una colección $out limitada.
Transacciones
No se puede escribir en colecciones limitadas en transacciones.
Stable API
Las colecciones con tamaño fijo no son compatibles con Stable API V1.
Procedimientos
Crea una colección con tamaño fijo
Debe crear colecciones limitadas explícitamente mediante el método,db.createCollection() que es un auxiliar mongosh create para el comando. Al crear una colección limitada, debe especificar el tamaño máximo de la colección en bytes, que MongoDB preasignará para la colección. El tamaño de la colección limitada incluye una pequeña cantidad de espacio para la sobrecarga interna.
db.createCollection( "log", { capped: true, size: 100000 } )
Nota
El valor que proporcione para el campo size debe ser mayor que 0 y menor o igual que 1024^5 (1 PB). MongoDB redondea el size de todas las colecciones limitadas al múltiplo entero más cercano de 256, en bytes.
Además, también puede especificar un número máximo de documentos para la colección utilizando el campo max como en el siguiente documento:
db.createCollection("log", { capped : true, size : 5242880, max : 5000 } )
Importante
El argumento size es siempre obligatorio, incluso cuando se especifica el número max de documentos. MongoDB remueve los documentos más antiguos si una colección alcanza el límite máximo de tamaño antes de alcanzar el máximo de documentos.
Query una colección con tamaño fijo
Si realizas un find() en una colección con tamaño fijo sin especificar el orden, MongoDB garantiza que el orden de los resultados sea el mismo que el orden de inserción.
Para recuperar documentos en orden inverso de inserción, ejecuta find() junto con el método sort() y el parámetro $natural configurado en -1, como se muestra en el siguiente ejemplo:
db.cappedCollection.find().sort( { $natural: -1 } )
Verificar si una colección es limitada
Utilice el isCapped() método para determinar si una colección tiene un límite, de la siguiente manera:
db.collection.isCapped()
Convertir una colección a limitada
Puede convertir una colección sin límite en una colección con límite con el convertToCapped comando:
db.runCommand({"convertToCapped": "mycoll", size: 100000});
El parámetro size especifica el tamaño de la colección con tamaño fijo en bytes.
Esto mantiene un bloqueo exclusivo de base de datos durante el período de la operación. Otras operaciones que bloqueen la misma base de datos serán bloqueadas hasta que la operación se complete. Consulta ¿Qué bloqueos toma algunas operaciones comunes del cliente? para operaciones que bloquean la base de datos.
Cambiar el tamaño de una colección con tamaño fijo
Novedades en la versión 6.0.
Puede cambiar el tamaño de una colección limitada usando la collMod opción del comando cappedSize para establecer cappedSize en bytes. cappedSize debe ser mayor que 0 y menor o igual que 1024^5 (1 PB).
Nota
Antes de poder cambiar el tamaño de una colección limitada, debe haber establecido featureCompatibilityVersion al menos en la "6.0" versión.
Por ejemplo, el siguiente comando establece el tamaño máximo de la colección con tamaño fijo "log" en 100.000 bytes:
db.runCommand( { collMod: "log", cappedSize: 100000 } )
Cambiar el número máximo de documentos en una colección con tamaño fijo
Novedades en la versión 6.0.
Para cambiar el número máximo de documentos en una colección con tamaño fijo, utiliza la opción cappedMax del comando collMod. Si cappedMax es menor o igual que 0, no hay un límite máximo de documentos. Si cappedMax es menor que el número actual de documentos en la colección, MongoDB remueve el exceso de documentos en la siguiente operación de inserción.
Por ejemplo, el siguiente comando establece el número máximo de documentos en la colección con tamaño fijo "log" a 500:
db.runCommand( { collMod: "log", cappedMax: 500 } )
Cursor con seguimiento
Puedes usar un cursor con seguimiento con las colecciones con tamaño fijo. De manera similar al comando tail -f de Unix, el cursor con seguimiento "sigue" el final de una colección con tamaño fijo. A medida que se insertan nuevos documentos en la colección con tamaño fijo, puedes utilizar el cursor con seguimiento para continuar recuperando documentos.
Consulta cursores con seguimiento para obtener información sobre cómo crear un cursor con seguimiento.