Запрос документов с вложенными данными
Запрос данных является фундаментальной операцией базы данных. На этом шаге вы научитесь запрашивать документы на основе значений во вложенных объектах и массивах. Чтобы обеспечить наличие чистого набора данных для этих примеров, сначала удалите существующую коллекцию books.
db.books.drop()
Теперь вставьте несколько новых документов с различными вложенными структурами для практики запросов.
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 }
]
}
])
Чтобы найти книгу по полю во вложенном документе, используйте точечную нотацию (dot notation). Этот запрос находит книгу, написанную "John Doe".
db.books.find({ "author.name": "John Doe" })
Вы можете углубляться во вложенные структуры. Этот запрос находит книги, в которых специализация автора — "Database Design".
db.books.find({ "author.experience.specialization": "Database Design" })
Чтобы найти документы, где массив содержит определенное значение, вы можете напрямую запрашивать поле массива. Этот запрос находит все книги с тегом "nosql".
db.books.find({ tags: "nosql" })
Вы также можете запрашивать документы, где элемент массива соответствует определенному условию. Этот запрос находит книги, у которых есть хотя бы одна глава объемом более 40 страниц, используя оператор $gt (больше чем).
db.books.find({ "chapters.pages": { $gt: 40 } })
Наконец, вы можете комбинировать несколько условий. Этот запрос находит книги с тегом "advanced", написанные автором с опытом работы 5 лет и более ($gte означает больше или равно).
db.books.find({
"author.experience.years": { $gte: 5 },
tags: "advanced"
})