Un describe cómo una aplicación necesita leer, filtrar, ordenar, proyectar, agregar y modificar datos. En MongoDB, los access patterns no son una optimización que se añade al final: son una entrada principal del diseño documental.
access pattern
La pregunta inicial no es “¿qué entidades existen?”, sino:
¿Qué operaciones debe resolver el sistema, con qué frecuencia, sobre qué volumen y con qué garantías?
La respuesta orienta:
qué información vive en el mismo documento;
qué se referencia;
qué campos se duplican como snapshot;
qué arrays pueden crecer;
qué query shape se utilizará;
qué índices se necesitan;
qué operaciones deben ser atómicas;
qué partes del workload podrían convertirse en hotspots.
Diseñar únicamente a partir de entidades produce documentos que “se ven correctos”, pero que pueden ser costosos o imposibles de consultar con eficiencia.
Supón un sistema de pedidos que identifica estas entidades:
Texto
business
customer
order
product
order_item
Ese inventario no responde todavía preguntas importantes:
¿Las órdenes se listan principalmente por negocio y estado?
¿El cliente debe aparecer sin otra lectura?
¿El precio de un producto debe conservarse como ocurrió al vender?
¿Los items de una orden tienen crecimiento acotado?
¿El stock se descuenta en la misma operación que crea la orden?
¿Existen reportes por día, sucursal o producto?
Sin esas respuestas, no es posible decidir correctamente embedding, references, indexes o transacciones.
caso de uso
↓
query o command
↓
filtros + sort + proyección + actualización
↓
frecuencia + volumen + consistencia
↓
document boundary
↓
índice y estrategia operativa
Un access pattern completo combina forma y contexto. La misma query ejecutada una vez al mes no tiene el mismo peso que una query ejecutada miles de veces por minuto.
Define qué datos necesita realmente el consumidor.
JavaScript
{customer:1,total:1,status:1,createdAt:1}
La proyección influye en payload, seguridad y posibilidad de covered query. No debe utilizarse para esconder un documento mal dimensionado, pero sí para evitar transferir campos innecesarios.
Pregunta cuántos valores pueden existir en una relación o conjunto:
one-to-one;
one-to-few;
one-to-many;
many-to-many;
crecimiento sin límite conocido.
Cardinalidad no es solo el valor promedio. También importa el peor caso y la distribución. Una tienda puede tener 10 categorías normalmente, pero un marketplace puede tener millones de productos.
El índice sigue la combinación de igualdad y sort de esta query. No se considera correcto solo por apariencia; debe validarse con datos representativos y explain('executionStats').
Ventaja: la orden es autosuficiente y conserva el nombre utilizado al comprar.
Coste: si el requisito exige mostrar siempre el nombre actual, debe definirse actualización, lectura adicional o separar nombre histórico de nombre vigente.
La decisión no nace de una regla genérica. Nace de qué significa ese dato en el caso de uso.
Una rare query puede aceptar más latencia, ejecutarse en un sistema analítico o utilizar un proceso batch. Crear índices para cada consulta rara aumenta escritura, memoria y almacenamiento.
Los writes también deben documentarse como access patterns.
Ejemplo:
Texto
Comando: cambiar estado pending → confirmed
Precondition: estado actual pending
Cambios: status, confirmedAt, version
Concurrencia: impedir doble confirmación
Resultado: modifiedCount 1 o conflicto
Update:
JavaScript
const result =await db.orders.updateOne({_id: orderId,status:'pending',version: expectedVersion
},{$set:{status:'confirmed',confirmedAt:newDate()},$inc:{version:1}});if(result.modifiedCount !==1){thrownewError('Order changed or is no longer pending');}
El filtro funciona como precondition y control optimista de concurrencia. Leer primero y actualizar después sin condición dejaría una ventana de carrera.
Un access pattern analítico debe registrar stages y cardinalidad esperada.
Ejemplo: ventas diarias por método de pago.
Texto
$match por tenant y rango de fecha
↓
$group por día y paymentMethod
↓
$sort cronológico
El índice puede ayudar al $match, pero $group sigue consumiendo recursos. Si la consulta es muy frecuente, podría utilizarse computed pattern o una colección derivada, con una estrategia explícita de actualización.
Insertar o actualizar documentos entre páginas puede alterar el conjunto. La aplicación debe decidir si necesita snapshot consistency o acepta una vista cambiante.
Los access patterns conectan requisitos con persistencia. Un buen diseño explica para cada operación qué lee, qué modifica, cuánto crece, qué garantiza y qué cuesta. MongoDB permite modelar documentos alrededor de esas operaciones, pero obliga a hacer explícitos los trade-offs.
Comprueba lo aprendido
¿Por qué una lista de entidades no basta para diseñar MongoDB?
¿Qué información necesitas antes de elegir el orden de un índice compuesto?
Una orden debe mostrar el nombre histórico del cliente. ¿Qué modelo considerarías y por qué?
¿Cómo convertirías un cambio de estado en una operación segura frente a concurrencia?
¿Por qué una query mensual no siempre justifica un índice dedicado?
¿Qué cambia en el diseño si un tenant concentra el 80% de los datos?