馃搨 Crear colecciones (Collection)
En MongoDB, una colecci贸n es el contenedor de documentos (equivalente a una tabla en SQL). Aunque MongoDB crea colecciones autom谩ticamente al insertar el primer documento, hay situaciones en las que crear la colecci贸n expl铆citamente ofrece ventajas: definir validadores, opciones (capped, size), 铆ndices iniciales, configuraci贸n de particionado (sharding), etc. Aqu铆 tienes una gu铆a paso a paso y ejemplos para una tienda online.
馃敡 Herramientas a utilizar
- mongosh — consola interactiva (l铆nea de comandos).
- MongoDB Compass — GUI oficial (crear colecciones, validadores, 铆ndices visualmente).
- Driver oficial de Node.js o Mongoose — para crear/usar colecciones desde tu aplicaci贸n.
- Atlas (si usas la nube) — creaci贸n desde UI o mediante la consola/CLI.
1️⃣ Conceptos r谩pidos antes de crear
- Colecci贸n normal: almacenamiento din谩mico, sin l铆mite predeterminado.
- Colecci贸n capped: tama帽o fijo, comportamiento FIFO, 煤til para logs o colas.
- Validadores/JSON Schema: permiten garantizar estructura m铆nima.
- 脥ndices: mejoran lecturas; se pueden crear al crear la colecci贸n o despu茅s.
- TTL index: 铆ndice que elimina documentos despu茅s de X segundos (煤til para sesiones, tokens).
- Sharding: particionado horizontal para colecciones muy grandes (requiere replica set y sharding habilitado).
2️⃣ Crear colecci贸n con mongosh — paso a paso
Ejemplo: colecci贸n products y orders para una tienda online.
// Conectar con mongosh y seleccionar DB mongosh use tiendaDB // 1) Crear colecci贸n simple (se crea autom谩ticamente al insertar, pero lo hacemos expl铆cito) db.createCollection("products") // 2) Crear colecci贸n con validador JSON Schema (estructura m铆nima garantizada) db.createCollection("products", { validator: { $jsonSchema: { bsonType: "object", required: ["name", "price", "sku", "stock"], properties: { name: { bsonType: "string" }, price: { bsonType: "double" }, sku: { bsonType: "string" }, stock: { bsonType: "int" }, categories: { bsonType: "array" } } } }, validationLevel: "moderate" // o "strict" }) // 3) Colecci贸n capped (logs) db.createCollection("eventLogs", { capped: true, size: 10485760 }) // 10 MB // 4) 脥ndice TTL en 'createdAt' para eliminar sesiones tras 24h (86400s) db.sessions.createIndex({ "createdAt": 1 }, { expireAfterSeconds: 86400 })
Nota: createCollection permite opciones; si prefieres, simplemente inserta el primer documento y MongoDB crear谩 la colecci贸n por ti.
3️⃣ Crear y configurar colecciones con MongoDB Compass
- Abrir Compass y conectar a
mongodb://localhost:27017o a tu cluster Atlas. - Seleccionar la base de datos (o crear nueva → Create Database).
- Click en Create Collection → escribe el nombre (ej.
products). - (Opcional) En Settings a帽ade Validation con JSON Schema.
- Crear 铆ndices desde la pesta帽a Indexes.
4️⃣ Ejemplos pr谩cticos — estructura recomendada para la tienda online
Algunas colecciones 煤tiles y su prop贸sito:
- products: cat谩logo de productos (name, sku, price, stock, categories, images, attributes).
- usuarios: datos de clientes (nombre, email, passwordHash, direccion, roles).
- orders: pedidos (referencia al usuario, array de items, totals, estado, createdAt).
- carts: carritos temporales (userId o sessionId, items).
- sessions: sesiones de usuario (sessionId, userId, createdAt) - usar TTL index.
- eventLogs: logs de eventos (capped collection recomendable).
// Ejemplo: insertar un producto m铆nimo
db.products.insertOne({
name: "Camiseta b谩sica",
sku: "CAM-001",
price: 19.99,
stock: 120,
categories: ["ropa","hombre"],
createdAt: new Date()
})
// Ejemplo: insertar un pedido
db.orders.insertOne({
userId: ObjectId("..."),
items: [
{ productId: ObjectId("..."), qty: 2, price: 19.99 }
],
total: 39.98,
status: "pending",
createdAt: new Date()
})
5️⃣ 脥ndices recomendados por colecci贸n
- products:
{ sku: 1 }(煤nico),{ price: 1 }si buscas por precio,{ "categories": 1 }. - usuarios:
{ email: 1 }(煤nico),{ createdAt: -1 }. - orders:
{ userId: 1, createdAt: -1 },{ status: 1 }. - sessions: TTL index en
createdAt.
// Crear 铆ndice 煤nico en sku
db.products.createIndex({ sku: 1 }, { unique: true })
// 脥ndice compuesto en orders
db.orders.createIndex({ userId: 1, createdAt: -1 })
6️⃣ TTL y colecciones capped — cu谩ndo usarlas
- TTL index: elimina documentos despu茅s de X segundos — ideal para tokens temporales, sesiones.
- Capped collection: tama帽o fijo, escrituras r谩pidas y orden FIFO — ideal para logs o colas de eventos donde solo interesa lo m谩s reciente.
// TTL en sessions (ejemplo 24 horas)
db.sessions.createIndex({ "createdAt": 1 }, { expireAfterSeconds: 86400 })
// Crear capped collection para logs (5 MB)
db.createCollection("logsApp", { capped: true, size: 5242880 })
7️⃣ Sharding: cu谩ndo shardear una colecci贸n y ejemplo
Sharding es para colecciones muy grandes que exceden la capacidad de un solo servidor. Requiere:
- Replica set habilitado.
- Sharding activado en el cluster.
// Habilitar sharding (en mongos) y shardear
sh.enableSharding("tiendaDB")
db.products.createIndex({ sku: 1 }) // 铆ndice necesario
sh.shardCollection("tiendaDB.products", { sku: 1 })
Consejo: evita shard keys con valores con poca cardinalidad (ej. booleanos) o monoton铆a (ej. timestamps) que causan hot shards.
8️⃣ Crear y usar colecciones desde Node.js (ejemplo m铆nimo)
// npm install mongodb const { MongoClient } = require("mongodb"); async function run() { const client = new MongoClient("mongodb://localhost:27017"); await client.connect(); const db = client.db("tiendaDB"); // Crear colecci贸n explicitamente (opcional) await db.createCollection("products"); const products = db.collection("products"); await products.insertOne({ name: "Zapatos", sku: "ZAP-100", price: 49.99, stock: 30, createdAt: new Date() }); const p = await products.findOne({ sku: "ZAP-100" }); console.log(p); await client.close(); } run().catch(console.error);
9️⃣ Crear modelos/colecciones con Mongoose
// npm install mongoose const mongoose = require("mongoose"); async function main(){ await mongoose.connect("mongodb://localhost:27017/tiendaDB"); const productSchema = new mongoose.Schema({ name: { type: String, required: true }, sku: { type: String, required: true, unique: true }, price: { type: Number, required: true }, stock: { type: Number, default: 0 }, categories: [String], createdAt: { type: Date, default: Date.now } }); const Product = mongoose.model("Product", productSchema); // crea colecci贸n 'products' autom谩ticamente const p = await Product.create({ name: "Gorra", sku: "GOR-01", price: 9.99 }); console.log("Creado:", p._id); } main().catch(console.error);
馃攼 Buenas pr谩cticas y consideraciones
- Nombrar colecciones en plural o seg煤n convenci贸n del equipo (
products,orders). - Definir validaciones b谩sicas para evitar documentos incorrectos.
- Crear 铆ndices basados en consultas reales, no por suposiciones.
- Usar TTL para datos temporales (sessions, tokens).
- Evaluar embedding vs referencing: embed si accedes siempre al subdocumento con el padre; referenciar si subdocumentos crecen sin l铆mite o se comparten.
- Para gran escala, planificar shard key con datos de cardinalidad alta y buen patr贸n de acceso.
馃攣 Resumen pr谩ctico (checklist)
- Decide si crear la colecci贸n expl铆citamente o dejar que se cree al insertar el primer documento.
- Define validadores/JSON Schema si necesitas restricci贸n m铆nima.
- Crea 铆ndices importantes inmediatamente (ej. sku, email).
- Considera TTL/capped collections para casos espec铆ficos.
- Si esperas gran volumen, planifica sharding y replica sets con antelaci贸n.
- Documenta convenci贸n de nombres y estructura esperada para el equipo.
0 Comentarios
Si desea contactar comigo, lo puede hacer atravez deste formulario gracias