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:
- Busca listados que acomoden 4 o más personas (
accommodates) - Busca listados con calificación de reseñas mayor a 4.5 (
review_scores_rating) - Busca listados en CIUTAT VELLA O POBLATS MARITIMS (usa
$in) - Ordena todos los listados por
number_of_reviewsde mayor a menor y muestra los 10 primeros - Busca listados que tengan entre 10 y 50 reseñas (usa
$gtey$lte)
Pro:
- 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
- Busca listados donde el anfitrión tenga más de 5 propiedades (
host_total_listings_count) - Busca listados que NO sean del barrio EXTRAMURS y que acomoden más de 6 personas (usa
$ney$gt) - Busca listados cuyo nombre contenga la palabra "beach" o "playa" (usa
$regexcon$options: "i"para ignorar mayúsculas) - Busca listados donde el nombre del anfitrión (
host_name) empiece con la letra "A" (usa$regexcon el patrón^A) - Busca listados cuyo nombre contenga "centro" O "center" (usa
$regexcon el patrón(centro|center)y la opción "i")
This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.
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
Support me on Ko-fi
Comments
There are no comments yet.