Los arrays permiten almacenar varios valores o subdocumentos dentro de un mismo documento. Son una herramienta central del modelo documental porque representan relaciones one-to-few, listas ordenadas, etiquetas, líneas de una orden y otros conjuntos que pertenecen al aggregate.
Un array no es solo una forma cómoda de guardar una lista. Cambia la semántica de las consultas, convierte índices en multikey, influye en el tamaño del documento y concentra actualizaciones sobre la misma unidad atómica.
Sin arrays, una orden con veinte items tendría que representarse mediante campos repetidos o documentos separados. El array conserva ownership y permite leer o modificar la unidad completa.
Texto
order
└── items[]
├── item 1
├── item 2
└── item n
La estrategia funciona cuando los elementos pertenecen al documento y el crecimiento es controlable. Cuando los elementos tienen lifecycle, consultas o crecimiento independientes, una colección separada puede ser una mejor frontera.
No permite expresar directamente “más de tres elementos”. Para rangos de tamaño puede mantenerse un contador derivado, utilizar aggregation o rediseñar el access pattern.
Guardar un contador duplicado introduce una invariantes adicional:
JavaScript
{itemCount:3,items:[/* 3 elementos */]}
Debe actualizarse junto con el array o reconciliarse si se maneja de forma eventual.
Dot notation puede apuntar a una posición concreta:
JavaScript
{'items.0.productId': productId }
Esto busca documentos cuyo primer elemento cumple la condición. Acoplar queries a posiciones suele ser frágil salvo que el orden sea parte estable del dominio.
missing puede indicar versión antigua u optional field.
string indica tipo incompatible.
El schema y los consumidores deben decidir cuál es válido. Un campo que siempre es lista debería normalmente conservar tipo array incluso cuando está vacío.
Pero no crea una restricción unique equivalente a un índice. En arrays de documentos, la igualdad compara el documento completo. Estos dos elementos pueden considerarse distintos:
JavaScript
{userId:A,role:'viewer'}{userId:A,role:'editor'}
Si la regla exige una membresía única por userId, una colección de asociación con índice unique suele ser más sólida.
Los arrays conservan orden. Esto puede representar:
prioridad;
secuencia de pasos;
posición visual;
cronología acotada.
Sin embargo, mantener orden concurrentemente puede ser complejo. Insertar en una posición con $position o reordenar toda la lista puede generar contention y reemplazos costosos.
Si el orden cambia frecuentemente y la lista es grande, puede ser mejor guardar elementos separados con una clave de orden.
Cuando se indexa un campo array, MongoDB crea un índice multikey.
JavaScript
db.products.createIndex({businessId:1,tags:1});
Un documento genera entradas de índice para sus elementos. Esto permite buscar por valores, pero aumenta:
tamaño del índice;
trabajo de inserción y update;
memoria utilizada;
complejidad de compound indexes;
límites de covered queries.
MongoDB tiene restricciones sobre compound multikey indexes cuando más de un campo indexado contiene arrays. El diseño debe revisarse con el schema real y la versión utilizada.
Ordenar por un campo array no significa ordenar por “el primer elemento” de forma intuitiva en todos los contextos. MongoDB utiliza valores derivados del array según dirección y filtro. La semántica puede sorprender y debe verificarse con ejemplos y explain().
No diseñes paginación crítica sobre arrays sin entender qué clave de índice representa cada documento.
Aunque el array se mantuviera pequeño mediante limpieza, muchas escrituras simultáneas compiten por el mismo documento. El modelo correcto suele distribuir movimientos en documentos independientes.
Los arrays son apropiados cuando representan elementos dependientes y acotados. Aportan localidad y atomicidad, pero introducen crecimiento, multikey indexes y contention. La pregunta principal no es si MongoDB permite el array, sino cómo se comportará durante toda la vida del documento.
Comprueba lo aprendido
¿Qué diferencia existe entre igualdad de array y $all?
¿Por qué dos condiciones con dot notation pueden coincidir en elementos distintos?
¿Qué convierte un índice en multikey?
¿Por qué $addToSet no reemplaza un índice unique sobre una relación?
¿Qué señales indican que una lista debe salir del documento?