Filtra datos en MongoDB con $match

Resumen

El operador $match en MongoDB es la pieza clave para filtrar subconjuntos de datos dentro de un pipeline de agregación. Si vienes del mundo relacional, piénsalo como el equivalente a la cláusula WHERE: defines una condición y MongoDB te devuelve solo los documentos que cumplen ese criterio. Aquí verás cómo aplicarlo paso a paso usando MongoDB Compass sobre la colección de Airbnb.

¿Qué hace el operador $match en una agregación de MongoDB?

El operador $match selecciona un subconjunto de documentos según una condición que tú defines. Es la primera herramienta que necesitas cuando quieres reducir el universo de datos antes de procesarlo.

¿Qué es $match en MongoDB? Es un operador del aggregation pipeline que filtra documentos según un criterio, similar a un WHERE en SQL. Devuelve únicamente los registros que cumplen la condición.

En la clase trabajamos sobre la colección de Airbnb que viene en el pack de bases de datos de ejemplo de MongoDB Atlas, con cerca de 5.000 propiedades y documentos llenos de campos diversos [00:36]. El reto: encontrar las cinco propiedades más económicas en Estados Unidos.

¿Cómo se construye un pipeline con $match, $sort y $limit?

Para resolver el desafío usamos tres operadores encadenados, cada uno con un propósito claro:

  • $match para filtrar solo propiedades en Estados Unidos.
  • $sort para ordenarlas de menor a mayor precio.
  • $limit para quedarnos con las cinco primeras.

Este orden no es casualidad. Filtrar primero reduce el conjunto de datos y hace que las etapas siguientes sean más rápidas y consuman menos recursos.

¿Cómo aplicar $match sobre campos anidados en MongoDB Compass?

Dentro de Compass, abrimos la pestaña Aggregations y agregamos la primera etapa con $match [02:08]. Aquí entra un detalle importante: el campo country_code no está en la raíz del documento, sino dentro de un objeto llamado address.

La sintaxis para acceder a campos anidados usa notación de punto:

javascript { "address.country_code": "US" }

Apenas escribes la condición, Compass te muestra en tiempo real los documentos filtrados. Así confirmas que el filtro funciona antes de seguir.

¿Cómo filtro un campo dentro de un objeto en MongoDB? Usa notación de punto entre el objeto padre y el campo hijo. Por ejemplo, address.country_code accede al código de país dentro del objeto address.

¿Cómo ordenar resultados con $sort en un pipeline?

La segunda etapa es $sort, donde indicas el campo y la dirección del orden [03:15]. En Airbnb, el campo relevante es price, y la regla es simple:

  • 1 para orden ascendente (de menor a mayor).
  • -1 para orden descendente (de mayor a menor).

La sintaxis queda así:

javascript { price: 1 }

Compass actualiza la vista al instante y revela el dato curioso: la propiedad más barata del universo de 5.000 listings cuesta 16 dólares por noche.

¿Para qué sirve $limit y por qué cerrar con él?

La tercera etapa es $limit, que recorta el resultado al número exacto que necesitas. Para quedarnos con las cinco propiedades más económicas en Estados Unidos:

javascript { $limit: 5 }

Y listo. Tres etapas, un resultado limpio: las cinco propiedades más baratas de Estados Unidos en la colección de Airbnb [04:20].

¿Por qué conviene usar $match al inicio del pipeline?

Aunque puedes colocar $match en cualquier etapa del pipeline, la recomendación es usarlo lo antes posible. La razón es de eficiencia: cuanto antes reduzcas el subconjunto de datos, menos trabajo tendrán las etapas siguientes y menos recursos consumirá tu operación [04:48].

Piénsalo como filtrar arena antes de buscar oro: si primero descartas lo que no te interesa, encontrar lo valioso es mucho más rápido.

Ahora te toca a ti. Prueba el operador $match con otros campos de la colección, mezcla condiciones, experimenta con diferentes filtros y comparte tus resultados en los comentarios.