Запрос документов на основе содержимого массива
Запросы являются основой любой базы данных. MongoDB предлагает богатый набор операторов для запроса документов на основе содержимого их массивов. На этом заключительном этапе вы узнаете, как находить документы, сопоставляя элементы массива и их свойства.
Чтобы найти все документы, в которых массив содержит определенный элемент, вы можете включить это значение в фильтр запроса. Давайте найдем всех студентов, записанных на "Computer Science".
db.students.find({ courses: "Computer Science" }).pretty()
Этот запрос вернет документ Alice, поскольку ее массив courses содержит "Computer Science".
Чтобы найти документы, в которых массив содержит все из указанного набора элементов, используйте оператор $all.
db.students.find({
courses: { $all: ["Advanced Mathematics", "Computer Science"] }
}).pretty()
Это также вернет документ Alice, поскольку ее массив courses содержит оба этих значения.
Для более сложных условий для элементов массива оператор $elemMatch очень полезен. Он позволяет указать несколько критериев, которым должен соответствовать один элемент массива. Давайте найдем студентов, у которых есть хотя бы одна оценка выше 95.
db.students.find({
grades: { $elemMatch: { $gt: 95 } }
}).pretty()
Этот запрос вернет документ Bob, поскольку у него есть оценки выше 95. $gt означает "больше чем" (greater than).
Вы также можете выполнять запросы на основе количества элементов в массиве, используя оператор $size. Давайте найдем студентов, которые участвуют ровно в двух мероприятиях.
db.students.find({
activities: { $size: 2 }
}).pretty()
Это вернет документ Bob, поскольку его массив activities в настоящее время содержит два элемента.
Наконец, давайте добавим еще одного студента для практики комбинированного запроса.
db.students.insertOne({
name: "Charlie Brown",
courses: ["Art", "Music", "Literature"],
grades: [88, 92, 85],
activities: ["Painting Club"]
})
Теперь найдем студентов, которые изучают "Art" или "Music" (используя оператор $in) И имеют хотя бы одну оценку больше или равную 90 (используя $elemMatch с $gte).
db.students.find({
courses: { $in: ["Art", "Music"] },
grades: { $elemMatch: { $gte: 90 } }
}).pretty()
Этот запрос вернет документ "Charlie Brown", который соответствует обоим условиям.