Consultar padre e hijos
En este paso, exploraremos técnicas de consulta avanzadas para recuperar documentos relacionados en colecciones padre e hijo en MongoDB. Demonstraremos cómo encontrar y unir datos relacionados de manera efectiva.
Consultas de filtrado básico
Comencemos buscando libros de un autor específico:
db.books.find({ author_id: ObjectId("author1") })
Filtrado con múltiples condiciones
Consulte libros con múltiples filtros:
db.books.find({
author_id: ObjectId("author1"),
published: { $gt: 1812 }
})
Esta consulta encuentra libros de Jane Austen publicados después de 1812.
Pipeline de agregación para consultas complejas
Utilice el marco de agregación para unir información de autores y libros:
db.books.aggregate([
{ $lookup: {
from: "authors",
localField: "author_id",
foreignField: "_id",
as: "author_details"
}},
{ $match: {
"author_details.nationality": "British"
}},
{ $project: {
title: 1,
published: 1,
"author_name": "$author_details.name"
}}
])
Salida de ejemplo
[
{
_id: ObjectId(...),
title: 'Pride and Prejudice',
published: 1813,
author_name: ['Jane Austen']
},
{
_id: ObjectId(...),
title: 'Emma',
published: 1815,
author_name: ['Charles Dickens']
}
]
Ordenar y limitar resultados
Consulte y ordene libros por año de publicación:
db.books.find()
.sort({ published: 1 })
.limit(2)
Esto recupera los dos libros publicados más temprano.
Filtrado avanzado con expresiones regulares
Encuentre libros con títulos que contengan palabras específicas:
db.books.find({
title: { $regex: /Sense/, $options: 'i' }
})
La opción $options: 'i'
hace que la búsqueda sea insensible a mayúsculas y minúsculas.
Contar documentos relacionados
Cuente los libros de cada autor:
db.books.aggregate([
{ $group: {
_id: "$author_id",
book_count: { $sum: 1 }
}},
{ $lookup: {
from: "authors",
localField: "_id",
foreignField: "_id",
as: "author_info"
}},
{ $project: {
author_name: "$author_info.name",
book_count: 1
}}
])
Salida de ejemplo
[
{
_id: ObjectId("author1"),
author_name: ['Jane Austen'],
book_count: 2
},
{
_id: ObjectId("author2"),
author_name: ['Charles Dickens'],
book_count: 2
}
]