Сегодня мы поговорим о агрегатах Монго: одна из лучших вещей, которые произошли с Монго. Давайте начнем с того, что вытащим несколько различий между обычной и монографической базами данных.
Mongo принадлежит к одной из тех баз данных NoSQL, которые нарушили работу интернета несколько лет назад. Все в отрасли говорили о них. Каждый хотел перенести свой стек в эти гибкие базы данных и говорил о том, как данные должны двигаться в этом направлении и так далее.
Когда шумиха начала улаживаться, люди начали понимать, что движение стека поможет, только если они правильно его реализуют, и для большинства из них сдвиг даже не был необходим.
NoSQL
это широкий термин и состоит из множества моделей баз данных. Монго также является одним из них. Другие включают в себя Cassandra
, Apache Spark
и многих других.
MongoDB — это распределенная база данных на основе документов. В производстве люди, как правило, запускают его с 3 репликами. 1 — хозяин, а два других — рабы. Это обеспечивает избыточность и высокую доступность данных.
Вы также можете быть заинтересованы в:
Учебники и статьи по MongoDB: Полная коллекция
Вы можете настроить их так, чтобы они соответствовали любым рекомендациям, но по умолчанию операции чтения и записи обрабатываются первичной репликой, а новые данные перемещаются в наборы реплик при каждой записи.
Поскольку у монго нет четко определенной схемы, делать запросы на основе данных довольно сложно.
Mongoose — это библиотека, которая может помочь вам в этом. Это дает много преимуществ, таких как создание хуков и индексов для коллекций.
Кстати, таблицы эквивалентов в Mongo известны как, collections
а строки строк известны как documents
.
Монго Агрегаты
Агрегаты MongoDB упрощают запрос данных из любой коллекции. Это включает в себя такие вещи, как сопоставление, получение данных из других коллекций, выбор полей и многое другое.
Давайте обсудим некоторые из этих совокупных запросов.
Начиная Монго Агрегат
Вы можете запустить агрегат, используя следующий код:
db.collection.aggregate([aggregate pipeline commands], options)
где collection — это имя коллекции, к которой применяется агрегат, а db — экземпляр подключенного объекта БД.
Ниже приведены команды, которые вы можете использовать в агрегатном конвейере.
Матч в Монго Агрегате
Запрос на совпадение можно назвать запросом where в терминах SQL. Вы указываете агрегату, чтобы получить данные, соответствующие данному условию. Рекомендуется как можно скорее сохранить запрос на совпадение в конвейере.
Это уменьшит количество документов, возвращаемых по запросу. Это также хороший вариант для индексации полей, в которых вы выполняете запрос на совпадение, чтобы быстрее возвращать результаты.
Например: В базе данных студентов вы можете сделать этот запрос следующим образом:
{ $match: { "roll_number": 901 }}
или
{ $match: { "class": 5 }}
Этот запрос вернет все документы, которые удовлетворяют данному запросу.
Для всех последующих частей конвейера вы можете продолжать добавлять его в основной массив конвейера.
Примечание. Вы можете использовать поля, добавляя их $
к имени полей всякий раз, когда вы хотите их использовать.
Используйте матч как можно раньше
Вы должны использовать $match
как можно раньше, чтобы использовать indexes
.
$match
Операции используют подходящие индексы для сканирования только соответствующих документов в коллекции. По возможности помещайте операторы $ match в начале конвейера.
Всегда пытайтесь объяснить $match
часть ваших запросов и предпочитайте создавать составные индексы в соответствии с вашими запросами.
Проект в Монго Агрегате
Проект — это часть, в которой вы сообщаете запросу, какие ключи выбрать из данного документа.
JSON
xxxxxxxxxx
1
{
2
$project: {
3
student_name: 1,
4
student_age: '$age'
5
}
6
}
Это подберет только поля со значением 1
в документе. Важно уменьшить объем данных, передаваемых в следующую часть конвейера.
Он также может быть использован для изменения имени поля. Это SELECT
эквивалент SQL
команд.
_id
поле добавляется по умолчанию в результате.
Группировка в Монго Агрегат
Группа используется для группировки разных вещей. Например, если вы хотите рассчитать сумму возраста учащихся по разным стандартам, запрос будет выглядеть примерно так.
Джава
xxxxxxxxxx
1
db.students.aggregate([
2
{ $group: { _id: "$class", total: { $sum: "$age" } } }
3
])
Вот ссылка на запрос монго. Вы можете использовать все различные типы совокупных запросов, такие как среднее, минимальное и максимальное.
Найти другие коллекции в Монго Агрегат
Поиск — это один из наиболее важных совокупных запросов, который вы можете использовать. Это позволяет нам объединять разные коллекции и получать данные из других коллекций.
Поиск также может быть использован с конвейером. С этим типом поиска вы можете применить проверку и сообщить конвейеру, когда данный поиск будет запущен.
Джава
xxxxxxxxxx
1
{
2
$lookup:
3
{
4
from: "students",
5
let: { studentId: "$_id", age: "$age" },
6
pipeline: [
7
{ $match:
8
{ $expr:
9
{ $eq: [ "$student_id", "$$studentId" ] }
10
}
11
},
12
{ $project: { student_id: 1, age: 1 } }
13
],
14
as: "data"
15
}
16
}
Это реализация, которую вы хотите использовать, когда хотите запустить $match
данные, выбранные из другой коллекции.
Простейшая реализация $lookup
заключается в следующем.
JSON
xxxxxxxxxx
1
{
2
$lookup: {
3
from: <collection to join>,
4
localField: <field from the input documents>,
5
foreignField: <field from the documents of the "from" collection>,
6
as: <output array field>
7
}
8
}
Как объяснить монго совокупные запросы
Чтобы объяснить запросы, вам нужно будет использовать параметры в совокупности, чтобы найти способ выполнения запросов.
Джава
xxxxxxxxxx
1
db.getCollection("author").explain().aggregate([
2
{
3
$match: {
4
"email" : "hello@heaven.god"
5
}
6
}
7
])
Это сгенерирует простой вывод, подобный этому.
Джава
xxxxxxxxxx
1
{
2
"stages" : [
3
{
4
"$cursor" : {
5
"query" : {
6
"email" : "hello@heaven.god"
7
},
8
"queryPlanner" : {
9
"plannerVersion" : 1.0,
10
"namespace" : "db_name.author",
11
"indexFilterSet" : false,
12
"parsedQuery" : {
13
"email" : {
14
"$eq" : "hello@heaven.god"
15
}
16
},
17
"winningPlan" : {
18
"stage" : "COLLSCAN",
19
"filter" : {
20
"email" : {
21
"$eq" : "hello@heaven.god"
22
}
23
},
24
"direction" : "forward"
25
},
26
"rejectedPlans" : [
27
]
29
}
30
}
31
}
32
],
33
"ok" : 1.0
34
}
winningplan
содержит объект, который сообщает нам больше о плане выигрыша, который использовался для выполнения запроса, и queryPlanner
содержит Array
план, который был опробован. Mongo выбирает лучшие планы и использует их для выполнения запросов.
Если вы используете explain
с executionStats
это даст вам такие вещи , как docs Returned
и docs Examined
что может быть полезным в поиске наиболее подходящее index
для вашего collection
.
Джава
xxxxxxxxxx
1
db.getCollection("author").explain("executionStats").aggregate([
2
{
3
$match: {
4
"email" : "hello@heaven.god"
5
}
6
}
7
])
Вывод
Есть еще несколько вариантов на выбор. Агрегат является одной из наиболее важных частей базы данных Mongo.
Если вы ежедневно работаете с этой базой данных, было бы полезно немного узнать об этом.
Спасибо, что зашли, и дайте мне знать, если вы хотите узнать о чем-то еще. Я люблю писать о технических темах.
Кроме того, дайте мне знать, если я сделал какие-либо ошибки в этом посте.
Примечание . Внутренний оптимизатор производительности агрегата Монго оптимизирует запросы соответственно, чтобы сделать их максимально быстрыми.