Consultar Documentos con Datos Anidados
La consulta es una operación fundamental de la base de datos. En este paso, aprenderá a consultar documentos basándose en valores dentro de objetos y matrices anidadas. Para asegurarnos de tener un conjunto de datos limpio para estos ejemplos, primero eliminaremos la colección books existente.
db.books.drop()
Ahora, inserte algunos documentos nuevos con diferentes estructuras anidadas para practicar la consulta.
db.books.insertMany([
{
title: "MongoDB Essentials",
author: {
name: "John Doe",
experience: { years: 5, specialization: "Database Design" }
},
tags: ["beginner", "database", "nosql"],
chapters: [
{ number: 1, title: "Introduction", pages: 25 },
{ number: 2, title: "Advanced Concepts", pages: 45 }
]
},
{
title: "Advanced Database Techniques",
author: {
name: "Jane Smith",
experience: { years: 8, specialization: "Distributed Systems" }
},
tags: ["advanced", "distributed", "nosql"],
chapters: [
{ number: 1, title: "System Design", pages: 35 },
{ number: 2, title: "Performance Optimization", pages: 55 }
]
}
])
Para encontrar un libro por un campo en un documento anidado, use la notación de puntos. Esta consulta encuentra el libro escrito por "John Doe".
db.books.find({ "author.name": "John Doe" })
Puede profundizar en estructuras anidadas. Esta consulta encuentra libros donde la especialización del autor es "Database Design".
db.books.find({ "author.experience.specialization": "Database Design" })
Para encontrar documentos donde una matriz contiene un valor específico, puede consultar el campo de la matriz directamente. Esto encuentra todos los libros etiquetados con "nosql".
db.books.find({ tags: "nosql" })
También puede consultar documentos donde un elemento de la matriz cumple una condición determinada. Esta consulta encuentra libros que tienen al menos un capítulo de más de 40 páginas, utilizando el operador $gt (mayor que).
db.books.find({ "chapters.pages": { $gt: 40 } })
Finalmente, puede combinar múltiples condiciones. Esta consulta encuentra libros etiquetados como "advanced" escritos por un autor con 5 o más años de experiencia ($gte significa mayor o igual que).
db.books.find({
"author.experience.years": { $gte: 5 },
tags: "advanced"
})