馃搨 Crear colecciones (Collection)

Crear colecciones (Collection)

馃搨 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

  1. Abrir Compass y conectar a mongodb://localhost:27017 o a tu cluster Atlas.
  2. Seleccionar la base de datos (o crear nueva → Create Database).
  3. Click en Create Collection → escribe el nombre (ej. products).
  4. (Opcional) En Settings a帽ade Validation con JSON Schema.
  5. 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:

  1. Replica set habilitado.
  2. Sharding activado en el cluster.
Elige la shard key con cuidado (debe distribuir uniformemente y usarse en consultas frecuentes).

// 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)

  1. Decide si crear la colecci贸n expl铆citamente o dejar que se cree al insertar el primer documento.
  2. Define validadores/JSON Schema si necesitas restricci贸n m铆nima.
  3. Crea 铆ndices importantes inmediatamente (ej. sku, email).
  4. Considera TTL/capped collections para casos espec铆ficos.
  5. Si esperas gran volumen, planifica sharding y replica sets con antelaci贸n.
  6. Documenta convenci贸n de nombres y estructura esperada para el equipo.

Publicar un comentario

0 Comentarios