00:00 / 00:00

Fecha publicación: 5 jul 2021

MongoDb Colecciones Circulares

Hoy vamos a cubrir un concepto interesante, las capped collection, también conocidas como colecciones circulares.

Lo primero vamos a definir un par de escenarios interesantes:

  • Hay ocasiones en las que tenemos tablas "monstruo", que no paran de crecer y que tienen datos que cuanto más antiguos, menos relevancia tienen (por ejemplo una tabla de log de operaciones), en casos como estos, si no controlas a tu bestia, está puede llegar a degradar el rendimiento de tu sistema e incluso reventarte un servidor.

  • Otro escenario interesante es si quieres tener el top 100 de novedades que te han entrado de un tipo de producto y quieres lecturas y escrituras muy rápidas.

Lo normal en el primer caso es tener demonios o triggers que vayan haciendo trabajo de limpieza, o en el segundo ir trabajando con índices.

MongoDb nos da una alternativa interesante ¿Y si te creo una colección que tiene un tamaño fijo en bytes o en número de documentos? Es decir:

  • Creo una tabla con hueco para 20 documentos.
  • Voy insertando documentos, mientras haya huecos todo va sobre ruedas.
  • Cuando ya tengo los casilleros de los 20 documentos ocupados y voy a insertar uno nuevo ¿qué ocurre? Que me voy al casillero con el documento más antiguo y lo machaco con el nuevo que voy a insertar.

Manos a la obra

Veamos esto en acción.

Entramos en el cli de Mongo

mongo

Vamos a crear una Base de Datos de prueba:

use miprueba

Creamos una colección en la que vamos a tener 5 documentos como máximo, para ello usaremos el comando createCollection en el que le indicamos en el primer parámetro el nombre de la colección, y en el segundo un objeto en el que definimos la siguiente configuración:

  • capped a true: le indicamos que esta colección es circular.

  • size: le indicamos el tamaño máximo en bytes que puede tener la colección, este parámetro se debe informar aunque queramos limitar por número de documentos (en este caso le añadimos un tamaño bien grande, para asegurarnos que el corte lo va a realizar por número de documentos almacenados).

  • max: este parámetro es opcional, aquí le indicamos el número máximo de documentos que queremos que tenga la colección, en esta caso 5.

db.createCollection("topfive", { capped: true, size: 100000, max: 5 });

Vamos a añadir cinco entradas con nombres de películas a está colección, para que sea más comodo, en vez de insertarlas de uno en uno utilizamos insertMany:

db.topfive.insertMany([
  { title: "Metropolis" },
  { title: "Planeta Prohibido" },
  { title: "2001: Odisea en el espacio" },
  { title: "Solaris" },
  { title: "Alien, el octavo pasajero" },
]);

Vamos a ver que datos hay:

db.topfive.find({}).pretty();

Ahora vamos a insertar un sexto elemento:

db.topfive.insertOne({
  title: "Blade Runner",
});

Volvemos a hacer un find:

db.topfive.find({}).pretty();

Como podemos ver, la colección sigue teniendo cinco elementos, y el elemento más antiguo: Metrópolis ha sido reemplazado por el nuevo que hemos insertado Blade Runner.

Otro tema interesante que puedes probar es a hacer un createCollection de una tabla que puedes llamar milog e informarle como parámetros de configuración el capped a true, indicándole un tamaño máximo con el párametro size, y ver que cuando llega al limite de tamaño, los documentos más antiguos se van borrando automáticamente.

¿Con ganas de aprender Backend?

En Lemoncode impartimos un Bootcamp Backend Online, centrado en stack node y stack .net, en él encontrarás todos los recursos necesarios: clases de los mejores profesionales del sector, tutorías en cuanto las necesites y ejercicios para desarrollar lo aprendido en los distintos módulos. Si quieres saber más puedes pinchar aquí para más información sobre este Bootcamp Backend.