Overview
Colecciones son agrupaciones de documentos de MongoDB, similares a un TablaRDBMS. Existe una colección dentro de una única base de datos.
Incluso si una colección no contiene ningún documento, conlleva un coste de recursos: un índice _id predeterminado que no se puede eliminar. Si bien este índice no ocupa mucho espacio por sí solo (especialmente para colecciones pequeñas), si tiene miles de colecciones, estos índices pueden acumular recursos y sobrecargar la asignación de su base de datos.
Si tu implementación incluye un número innecesario o creciente de colecciones, deberías considerar reorganizar tus datos para reducir el número de colecciones y, en última instancia, disminuir los requisitos de recursos de tu aplicación.
Ejemplo
Considera un temperatures base de datos que almacena colecciones de lecturas de temperatura obtenidas de un sensor. El sensor toma lecturas cada media hora desde las 10 AM hasta las 10 PM. Las lecturas de cada día se almacenan en una colección separada, nombrada por la fecha de la lectura:
// temperatures.march-09-2020 { "_id": 1, "timestamp": "2020-03-09T010:00:00Z", "temperature": 29 } { "_id": 2, "timestamp": "2020-03-09T010:30:00Z", "temperature": 30 } ... { "_id": 25, "timestamp": "2020-03-09T022:00:00Z", "temperature": 26 }
// temperatures.march-10-2020 { "_id": 1, "timestamp": "2020-03-10T010:00:00Z", "temperature": 30 } { "_id": 2, "timestamp": "2020-03-10T010:30:00Z", "temperature": 32 } ... { "_id": 25, "timestamp": "2020-03-10T022:00:00Z", "temperature": 28 }
Con cada día que pasa, el número de colecciones en la base de datos aumenta. Dado que el número de colecciones es ilimitado, hay una necesidad cada vez mayor de la base de datos de mantener estas colecciones y sus respectivos índices. Si la base de datos finalmente llega a un punto en el que gestiona miles de colecciones e índices, esto puede resultar en una degradación del rendimiento.
Además, este enfoque no facilita fácilmente las query a lo largo de varios días. Para consultar datos de varios días y obtener tendencias de temperatura durante períodos de tiempo más largos, sería necesario realizar una $lookup operación, que no es tan eficiente como hacer query de datos en la misma colección.
Esquema actualizado
En su lugar, un mejor enfoque para estructurar estos datos es almacenar todas las lecturas de temperatura en una sola colección y tener las lecturas de cada día en un solo documento. Considera este esquema actualizado, donde todas las temperaturas están en una sola colección: temperatures.readings:
// temperatures.readings { "_id": ISODate("2020-03-09"), "readings": [ { "timestamp": "2020-03-09T010:00:00Z", "temperature": 29 }, { "timestamp": "2020-03-09T010:30:00Z", "temperature": 30 }, ... { "timestamp": "2020-03-09T022:00:00Z", "temperature": 26 } ] } { "_id": ISODate("2020-03-10"), "readings": [ { "timestamp": "2020-03-10T010:00:00Z", "temperature": 30 }, { "timestamp": "2020-03-10T010:30:00Z", "temperature": 32 }, ... { "timestamp": "2020-03-10T022:00:00Z", "temperature": 28 } ] }
Este esquema actualizado requiere muchos menos recursos que el esquema original. Ahora, en lugar de requerir un índice para cada día que se registran las temperaturas, el índice _id por defecto en esta colección ayuda a facilitar las consultas por fecha.
Cómo comprobar la existencia de colecciones innecesarias
MongoDB Shell (mongosh)
Para comprobar la cantidad de colecciones en su base de datos, puede ejecutar el siguiente comando mongosh desde:
db.getCollectionNames().length
El método db.stats() también devuelve el número de colecciones en tu base de datos, junto con estadísticas útiles como el tamaño total de tus datos e índices.
MongoDB Ops Manager
Data Explorer
El gerente de operaciones Data Explorer proporciona una visión general de alto nivel de las colecciones en tus bases de datos. El Data Explorer muestra el tamaño total de una colección, incluso el tamaño de los índices de una colección. Si la mayor parte del tamaño de una colección se compone de índices, se puede considerar consolidar los datos de esa colección en otra y eliminar la colección original. Consulta la documentación de $merge para obtener un enfoque de fusión de datos de una colección a otra.
Además, si el Explorador de datos revela que tiene colecciones vacías, puede eliminar esas colecciones directamente desde el Explorador de datos.
Panel de rendimiento en tiempo real
El panel de rendimiento en tiempo real de Ops Manager muestra qué colecciones reciben más actividad. Puede usar esta herramienta para asegurarse de que, antes de eliminar una colección, su aplicación no la esté utilizando activamente.
Obtén más información
Para obtener más información sobre el Modelado de Datos en MongoDB y el modelo de esquema flexible, consulte Introducción al Modelado de Datos.
Para aprender más sobre bases de datos y colecciones, consulta Bases de datos y colecciones.
Para obtener más información sobre cómo incrustar datos relacionados en un solo documento, consulte Modelos de datos incrustados
Presentaciones de MongoDB.live 2020
Para aprender a incorporar el modelo de datos flexible en su esquema, consulte las siguientes presentaciones de MongoDB.live 2020:
Se puede aprender sobre las relaciones de entidades en MongoDB y ejemplos de sus implementaciones con Modelado de datos con MongoDB.
Se puede aprender sobre patrones avanzados de diseño de esquemas que se pueden incorporar en el esquema establecido con Patrones avanzados de diseño de esquemas.