Consultar arrays y subdocumentos en MongoDB es una de esas habilidades que separan a quien usa la base de datos de forma básica de quien realmente la domina. Aquí aprenderás a navegar estructuras anidadas, acceder a posiciones específicas de un array y filtrar elementos con $elemMatch, todo aplicado a datasets reales de ejemplo en MongoDB Atlas.
¿Cómo accedo a un atributo dentro de un subdocumento?
Cuando un documento tiene campos anidados, MongoDB te permite consultarlos con la notación de punto. Es la forma más limpia de preguntar por un atributo que vive dentro de otro objeto.
Por ejemplo, en la colección de viajes de bicicletas, cada documento tiene un campo start station location que a su vez contiene un type. Para traer solo los documentos cuyo type sea point, escribes la consulta usando start station location.type igual a point. Así de directo.
¿Qué hace la notación de punto en MongoDB? Te permite acceder a campos anidados dentro de subdocumentos. Escribes el nombre del campo padre, un punto y el nombre del campo hijo, todo entre comillas como una sola clave.
¿Cómo consulto una posición específica dentro de un array?
Aquí viene lo interesante. MongoDB te deja apuntar directamente a una posición del array usando su índice numérico, igual que en cualquier lenguaje de programación.
En la base de datos companies de Atlas, cada compañía tiene un array llamado relationships. Por convención del dataset, la persona en la posición cero suele ser el CEO o cofundador. Si quieres buscar compañías cuyo CEO tenga apellido Zuckerberg, la consulta combina el índice y la notación de punto: relationships.0.person.last_name igual a Zuckerberg.
El resultado en este caso es una sola compañía: Facebook. Para limpiar la respuesta, puedes aplicar una projection trayendo solo name y relationships con valor 1, evitando que el output se llene de campos innecesarios.
¿Qué pasa si busco un nombre más común como Mark?
Cambiando la consulta a relationships.0.person.first_name igual a Mark y aplicando un count, el resultado salta a 108 compañías cuyo CEO se llama Mark. Un número alto que muestra lo común del nombre entre líderes empresariales del dataset.
¿Cómo busco en cualquier posición del array sin importar el índice?
La limitación de usar 0 es obvia: solo miras al CEO. Pero si quieres encontrar a cualquier Mark relacionado con la compañía, sea cofundador, inversionista o CTO, necesitas otra herramienta.
Ahí entra $elemMatch, el operador que te permite preguntar a un array si alguno de sus elementos cumple ciertas condiciones, sin importar la posición. La consulta se ve así:
javascript
db.companies.find({
relationships: {
$elemMatch: { "person.first_name": "Mark" }
}
})
Al correr el count con esta versión, el número sube de 108 a 523 compañías. Es decir, hay 523 empresas con al menos una persona llamada Mark vinculada en algún rol, no solo como CEO.
¿Cuándo uso $elemMatch en lugar de un índice? Usa $elemMatch cuando no te importa la posición del elemento dentro del array y quieres encontrar cualquier coincidencia. Usa el índice (.0, .1) cuando sabes que la posición tiene un significado específico en tus datos.
¿Qué sintaxis debo recordar para arrays y subdocumentos?
Tres patrones cubren la mayoría de los casos que vas a encontrar:
- Notación de punto (
campo.subcampo) para entrar a atributos de un subdocumento.
- Índice numérico (
array.0.campo) para apuntar a una posición concreta del array.
$elemMatch para buscar dentro del array sin atarte a una posición.
Combinar estas tres formas te da control fino sobre cualquier estructura anidada, por compleja que sea. Y te prepara para el siguiente paso: el aggregation framework, donde estas consultas se vuelven aún más poderosas.
¿Qué consulta vas a probar primero en tu propio dataset?