5. Filtrar documentos

Ya sabes hacer consultas básicas con filtros exactos. Ahora aprenderás operadores más potentes para filtrar datos.

Operadores de comparación

Los operadores de comparación funcionan de manera similar a SQL:

  • $eq: igual a
  • $ne: no igual a
  • $gt: mayor que
  • $gte: mayor o igual que
  • $lt: menor que
  • $lte: menor o igual que
// Unicornios con más de 100 vampiros
db.unicorns.find({ vampires: { $gt: 100 } })

// Unicornios con 50 vampiros o menos
db.unicorns.find({ vampires: { $lte: 50 } })

// Unicornios que NO son machos
db.unicorns.find({ gender: { $ne: 'm' } })

Operadores lógicos

Para combinar condiciones:

AND implícito (separando con comas):

db.unicorns.find({
    gender: 'f',
    weight: { $gt: 400 }
})

OR explícito (con $or):

db.unicorns.find({
    $or: [
        { weight: { $lt: 500 } },
        { vampires: { $gt: 100 } }
    ]
})

Combinando AND y OR:

db.unicorns.find({
    gender: 'f',
    $or: [
        { weight: { $lt: 500 } },
        { vampires: { $lt: 50 } }
    ]
})

El operador $in

Para buscar valores en un array:

// Unicornios de Madrid o Barcelona
db.users.find({
    city: { $in: ['Madrid', 'Barcelona'] }
})

El operador $nin es lo contrario (not in):

db.users.find({
    city: { $nin: ['Madrid', 'Barcelona'] }
})

Búsquedas en arrays

MongoDB trata los arrays de forma especial. Si un campo es un array, puedes buscar si contiene un valor:

// Unicornios que aman las zanahorias
db.unicorns.find({ loves: 'carrot' })

Esto funciona aunque loves sea un array. MongoDB busca si 'carrot' está en el array.

Para buscar documentos con valores específicos en arrays:

// Unicornios que aman manzanas O naranjas
db.unicorns.find({
    loves: { $in: ['apple', 'orange'] }
})

Búsquedas de texto parcial (equivalente a LIKE)

En SQL usas LIKE para buscar patrones de texto. En MongoDB usas $regex para expresiones regulares.

Búsqueda básica

// SQL: WHERE name LIKE 'Aurora%'
// MongoDB: nombres que empiezan con "Aurora"
db.unicorns.find({ name: { $regex: /^Aurora/ } })

// SQL: WHERE name LIKE '%horn%'
// MongoDB: nombres que contienen "horn"
db.unicorns.find({ name: { $regex: /horn/ } })

// SQL: WHERE name LIKE '%a'
// MongoDB: nombres que terminan con "a"
db.unicorns.find({ name: { $regex: /a$/ } })

Búsqueda case-insensitive

Por defecto, las búsquedas distinguen mayúsculas. Usa la opción i para ignorarlas:

// Busca "aurora" sin importar mayúsculas/minúsculas
db.unicorns.find({ name: { $regex: /aurora/i } })

// También puedes usar sintaxis de string
db.unicorns.find({ name: { $regex: "aurora", $options: "i" } })

Patrones comunes

// Empieza con "A" o "B" (case-insensitive)
db.unicorns.find({ name: { $regex: /^[AB]/i } })

// Contiene "horn" o "corn"
db.unicorns.find({ name: { $regex: /(horn|corn)/ } })

// Nombres de 5 letras exactamente
db.unicorns.find({ name: { $regex: /^.{5}$/ } })

Opciones disponibles

  • i: case-insensitive (ignora mayúsculas/minúsculas)
  • m: multiline (^ y $ consideran cada línea)
  • s: dotall (el punto . incluye saltos de línea)
  • x: verbose (permite espacios y comentarios en la expresión)

Importante: las búsquedas con regex pueden ser lentas en colecciones grandes. Para mejor rendimiento, crea un índice en el campo y usa patrones que empiecen con ^ (anclados al inicio).

Ordenar resultados

Usa sort para ordenar:

// Por peso descendente
db.unicorns.find().sort({ weight: -1 })

// Por género ascendente, luego vampiros descendente
db.unicorns.find().sort({ gender: 1, vampires: -1 })
  • 1 = orden ascendente
  • -1 = orden descendente

Limitar resultados

Usa limit para obtener solo los primeros N resultados:

// Los 3 unicornios más pesados
db.unicorns.find().sort({ weight: -1 }).limit(3)

Usa skip para saltar resultados:

// Salta los primeros 5 y devuelve los siguientes 3
db.unicorns.find().skip(5).limit(3)

Contar documentos

Para contar documentos que coinciden con un filtro:

db.unicorns.countDocuments({ vampires: { $gt: 50 } })

El operador $exists

Para buscar documentos que tienen (o no tienen) un campo:

// Documentos que tienen el campo 'vampires'
db.unicorns.find({ vampires: { $exists: true } })

// Documentos que NO tienen el campo 'vampires'
db.unicorns.find({ vampires: { $exists: false } })
Actividad 1

Usa operadores de comparación y filtros con los datos de Airbnb:

  1. Busca listados que acomoden 4 o más personas (accommodates)
  2. Busca listados con calificación de reseñas mayor a 4.5 (review_scores_rating)
  3. Busca listados en CIUTAT VELLA O POBLATS MARITIMS (usa $in)
  4. Ordena todos los listados por number_of_reviews de mayor a menor y muestra los 10 primeros
  5. Busca listados que tengan entre 10 y 50 reseñas (usa $gte y $lte)

Pro:

  1. Busca listados que cumplan TODAS estas condiciones: barrio CIUTAT VELLA, tipo "Entire home/apt", más de 10 reseñas y calificación mayor a 4.0
  2. Busca listados donde el anfitrión tenga más de 5 propiedades (host_total_listings_count)
  3. Busca listados que NO sean del barrio EXTRAMURS y que acomoden más de 6 personas (usa $ne y $gt)
  4. Busca listados cuyo nombre contenga la palabra "beach" o "playa" (usa $regex con $options: "i" para ignorar mayúsculas)
  5. Busca listados donde el nombre del anfitrión (host_name) empiece con la letra "A" (usa $regex con el patrón ^A)
  6. Busca listados cuyo nombre contenga "centro" O "center" (usa $regex con el patrón (centro|center) y la opción "i")

Soluciones

This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.

Desafíos de programación atemporales y multiparadigmáticos

Desafíos de programación atemporales y multiparadigmáticos

Te encuentras ante un librillo de actividades, divididas en 2 niveles de dificultad. Te enfrentarás a los casos más comunes que te puedes encontrar en pruebas técnicas o aprender conceptos elementales de programación.

Buy the book

Will you buy me a coffee?

Comments

There are no comments yet.

Visitors in real time

You are alone: 🐱