Curso
Cuando trabajes con MongoDB, especialmente si eres un programador procedente de una base de datos relacional, una de las primeras cosas que notarás es lo flexible que puede ser el diseño del esquema.
Las colecciones en MongoDB no necesitan crearse explícitamente de antemano, pero hay ocasiones en las que tiene sentido definirlas explícitamente y configurarlas con cuidado.
En este artículo, veremos cómo y cuándo puedes querer crear una colección en MongoDB, algunas opciones de configuración clave a tener en cuenta y algunos ejemplos de código en JS y C# (mi favorito).
No te preocupes, tenemos mucha paridad de funciones entre los controladores, así que mucho de lo que veas hoy aquí será posible en <inserta el idioma que prefieras>.
Si eres nuevo en las bases de datos NoSQL, considera empezar con una Introducción a NoSQL.
¿Qué es una colección MongoDB?
Antes de ver cómo crear colecciones, hablemos brevemente de lo que es una colección.
Si tienes conocimientos de SQL, puede que estés acostumbrado a oír hablar de tablas, filas y columnas. En MongoDB, los términos son ligeramente diferentes. En lugar de tablas, tenemos colecciones, y en lugar de filas, tenemos documentos con campos y no columnas.
Uno de los superpoderes de MongoDB es su esquema dinámico. Eso significa que no necesitas crear una colección manualmente antes de utilizarla. Si insertas un documento en una colección que todavía no existe, MongoDB lo creará automáticamente. Por ejemplo, si ejecutas
db.movies.insertOne({ title: "The Matrix", year: 1999 });
Intentará insertar un único documento de la película "Matrix" en la colección movies
. Si ya existe, el documento se añadirá a la colección. Si no lo hace, la colección movies
se creará antes de añadir el nuevo documento.
También puedes añadir muchos documentos a la vez, utilizando insertMany
en lugar de insertOne
.
Cuándo definir explícitamente las colecciones de MongoDB
Aunque puedes dejar que MongoDB se encargue de la creación de colecciones automáticamente, hay buenas razones para definir las colecciones con antelación, especialmente en escenarios de producción. Crear colecciones explícitamente te da la oportunidad de:
- Configura colecciones limitadas para registro o almacenamiento en caché.
- Establece reglas de validación para aplicar restricciones en tus esquemas.
- Aplica determinados índices por defecto, como el tiempo de vida (TTL). Estos índices sobre un campo de fecha eliminarán automáticamente los documentos de tu colección en función del tiempo que especifiques.
- Optimiza las cargas de trabajo de escritura pesada mediante el pre-dimensionamiento de las colecciones.
Así es como se crea una colecciónen el terminal de MongoDB:
db.createCollection("auditLogs", {
capped: true,
size: 10485760, // 10 MB
max: 1000
});
O con validación:
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["email", "createdAt"],
properties: {
email: {
bsonType: "string",
pattern: "^.+@.+$"
},
createdAt: {
bsonType: "date"
}
}
}
}
});
Aunque MongoDB admite un esquema flexible, es posible que quieras añadir reglas de validación, como campos obligatorios, o especificar propiedades en determinados campos, como tipos de datos o formato para correos electrónicos, como se ha visto anteriormente. Si quieres asegurarte de que tus documentos siguen un esquema concreto.
La aplicación de esquemas te resultará familiar si tienes conocimientos de SQL, e incluso si no los tienes, a veces tus aplicaciones en producción necesitan tener documentos con una forma predecible. ¡Así que la validación es excelente para esto!
Creación de colecciones MongoDB con el controlador C#
En una aplicación C#, también puedes crear colecciones explícitamente utilizando el controlador MongoDB. Aunque no es necesario para las operaciones básicas, aquí es donde puedes establecer opciones avanzadas mediante programación.
var options = new CreateCollectionOptions
{
Capped = true,
MaxSize = 10485760, // 10 MB
MaxDocuments = 1000
};
await database.CreateCollectionAsync("auditLogs", options);
Para añadir un validador:
var validator = new BsonDocument
{
{ "$jsonSchema", new BsonDocument
{
{ "bsonType", "object" },
{ "required", new BsonArray { "email", "createdAt" } },
{ "properties", new BsonDocument
{
{ "email", new BsonDocument
{
{ "bsonType", "string" },
{ "pattern", "^.+@.+$" }
}
},
{ "createdAt", new BsonDocument
{
{ "bsonType", "date" }
}
}
}
}
}
}
};
var collectionOptions = new CreateCollectionOptions<BsonDocument>
{
Validator = new BsonDocumentFilterDefinition<BsonDocument>(validator)
};
await database.CreateCollectionAsync("users", collectionOptions);
Para los programadores de Python, el tutorial Introducción a MongoDB y Python es un gran recurso.
Opciones clave de configuración de las colecciones que debes conocer
Al crear colecciones explícitamente, aquí tienes algunas opciones que te puede interesar conocer:
capped
: crea una colección de tamaño fijosize
: tamaño máximo en bytes de una colección limitadamax
: número máximo de documentos permitidosvalidator
: Objeto JSON en sintaxis de esquema que define la validación del esquemaexpireAfterSeconds
: se utiliza con índices TTL para gestionar la autoeliminación de documentos
También puedes aplicar índices en el momento de la creación time o poco después. MongoDB no creará índices automáticamente a menos que sean necesarios para _id
.
Los índices en MongoDB te permiten mejorar el rendimiento de los campos a los que accedes con más frecuencia. Guardarán esos valores en caché en la memoria, lo que significa que no habrá que llamar al disco duro para recuperarlos, lo que puede ahorrar mucho tiempo y rendimiento al acceder a ellos de forma habitual.
Buenas prácticas para definir colecciones MongoDB
Aquí tienes algunas pautas que te ayudarán a decidir cuándo definir explícitamente las colecciones:
- Creación implícita para pruebas rápidas de concepto o desarrollo local, o cuando el usuario final puede generar el contenido dinámicamente
- Creación explícita para cuando quieras aplicar validación o aplicar ajustes de indexación o rendimiento
Conclusión
MongoDB es conocido por su esquema flexible que nos da flexibilidad en cómo estructuramos nuestros datos, y eso incluye cómo creamos y gestionamos colecciones. Mientras que la creación implícita es rápida y cómoda, las definiciones explícitas de colecciones desbloquean potentes funciones como la validación de esquemas, el comportamiento capado y el ajuste del rendimiento.
Como siempre, MongoDB Atlas facilita aún más la gestión de colecciones con herramientas basadas en la interfaz de usuario, automatización y perspectivas de rendimiento integradas. Y si trabajas en .NET, el controlador C# te cubre con modelos de tipos fuertes y API fluidas.
Al considerar las mejores prácticas para definir las colecciones de MongoDB, también puede ser beneficioso comprender losprincipios fundamentales del diseño de bases de datos.
¡Feliz codificación! ¡Que tus colecciones sean rápidas, válidas y estén bien indexadas!
Conviértete en Ingeniero de Datos
Preguntas frecuentes
¿Cuál es la diferencia entre la creación implícita y explícita de colecciones en MongoDB?
- Creación implícita: MongoDB crea automáticamente una colección cuando insertas un documento en una colección inexistente. Esto es útil para la creación rápida de prototipos o el desarrollo.
- Creación explícita: Defines manualmente una colección antes de utilizarla, a menudo para configurar opciones avanzadas como reglas de validación, tamaño máximo o indexación. Se recomienda para entornos de producción.
¿Cuándo debo crear explícitamente una colección en lugar de dejar que MongoDB la cree automáticamente?
Debes crear explícitamente una colección cuando: validación de esquemas, colecciones capadas, optimizaciones de rendimiento e índices por defecto.
¿Cómo aplico un esquema en MongoDB si no tiene esquema?
MongoDB admite la validación del esquema JSON, que te permite definir reglas para la estructura del documento.
¿Qué son los cobros limitados y cuándo debo utilizarlos?
Las colecciones limitadas son colecciones de tamaño fijo que sobrescriben automáticamente los documentos antiguos cuando están llenas.
¿Cómo creo una colección con un índice TTL (Time-To-Live)?
Los índices TTL eliminan automáticamente los documentos después de un tiempo determinado. Primero, crea la colección y, después, añade el índice.
Luce Carter es Senior Developer Advocate en MongoDB, MVP de Microsoft, Contentful Dev Hero, autora de Beginning MongoDB Atlas with .NET, y amante del código, el sol y el aprendizaje.