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 acotadas. Puede crear un índice en la colección, pero mongod no elimina los documentos caducados.
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:
Almacene la información de registros generada por sistemas de alto volumen. Insertar documentos en una colección con tamaño fijo sin un índice es casi tan rápido como escribir información de registro directamente en un sistema de archivos. Asimismo, la propiedad incorporada primero en entrar, primero en salir mantiene el orden de los eventos mientras gestiona el uso del almacenamiento.
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.
Por ejemplo, el Oplog de set de réplicas que almacena un registro de las operaciones en un set de réplicas utiliza una colección con tamaño fijo. A diferencia de otras colecciones con tamaño fijo, el oplog puede crecer más allá de su límite de tamaño configurado para evitar borrar el majority
commit point.
_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.
Tamaño del documento
Si una actualización o un reemplazo cambia el tamaño del documento, la operación fallará.
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
Debes crear colecciones limitadas explícitamente usando el método db.createCollection(), que es un asistente mongosh del comando create. Cuando creas una colección con tamaño fijo, debes especificar el tamaño máximo de la colección en bytes, que MongoDB preasigna para la colección. El tamaño de la colección con tamaño fijo incluye una pequeña cantidad de espacio para carga interna.
db.createCollection( "log", { capped: true, size: 100000 } )
Si el campo size es menor o igual a 4096, entonces la colección tendrá un límite de 4096 bytes. De lo contrario, MongoDB aumentará el tamaño proporcionado para que sea un múltiplo entero de 256.
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.
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.