Consultar Documentos com Dados Aninhados
A consulta é uma operação fundamental de banco de dados. Nesta etapa, você aprenderá como consultar documentos com base em valores dentro de objetos aninhados e arrays. Para garantir que tenhamos um conjunto de dados limpo para estes exemplos, primeiro exclua a coleção books existente.
db.books.drop()
Agora, insira alguns novos documentos com diferentes estruturas aninhadas para praticar a 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 um livro por um campo em um documento aninhado, use a notação de ponto. Esta consulta encontra o livro escrito por "John Doe".
db.books.find({ "author.name": "John Doe" })
Você pode ir mais fundo em estruturas aninhadas. Esta consulta encontra livros onde a especialização do autor é "Database Design".
db.books.find({ "author.experience.specialization": "Database Design" })
Para encontrar documentos onde um array contém um valor específico, você pode consultar o campo do array diretamente. Isso encontra todos os livros marcados com "nosql".
db.books.find({ tags: "nosql" })
Você também pode consultar documentos onde um elemento de array atende a uma determinada condição. Esta consulta encontra livros que têm pelo menos um capítulo com mais de 40 páginas, usando o operador $gt (maior que).
db.books.find({ "chapters.pages": { $gt: 40 } })
Finalmente, você pode combinar várias condições. Esta consulta encontra livros marcados como "advanced" escritos por um autor com 5 ou mais anos de experiência ($gte significa maior ou igual a).
db.books.find({
"author.experience.years": { $gte: 5 },
tags: "advanced"
})