Конвейер агрегации MongoDB
Операции агрегации очень важны в любой базе данных, будь то SQL или NoSQL. Для выполнения операций агрегации MongoDB группирует значения из нескольких документов вместе, а затем выполняет различные операции над сгруппированными данными для возврата одного результата. SQL использует агрегатную функцию для возврата одного значения, вычисленного на основе значений в столбцах. В этой статье мы сосредоточимся на конвейере агрегации.
Агрегационный конвейер
Агрегационные конвейеры могут иметь один или несколько «этапов». Порядок этих этапов важен. Каждый этап действует на основе результатов предыдущего этапа.
Пример:
db.posts.aggregate([
// Stage 1: Only find documents that have more than 1 like
{
$match: { likes: { $gt: 1 } }
},
// Stage 2: Group documents by category and sum each categories likes
{
$group: { _id: "$category", totalLikes: { $sum: "$likes" } }
}
])
Различные этапы в конвейере
- $project выбор, изменение формы данных
- $match фильтровать данные
- $group агрегированные данные
- $sort сортирует данные
- $skip пропускает данные
- $limit лимит данных
- $unwind нормализует данные
Этапы конвейра
$project
На этапе проекта мы можем добавить ключ, удалить ключ, изменить форму ключа. Есть несколько простых функций, которые мы можем использовать для ключа: $toUpper, $toLower, $add, $multiply и т. д.
db.mycollection.aggregate([{
$project: {
_id: 0,
'department': {
$toUpper: '$dept_name'
},
'new_experience': {
$add: ['$experience', 1]
}
}
}])
$match
Это работает точно так же, как 'where clause' в SQL для фильтрации записей. Причина, по которой мы можем захотеть сопоставить, заключается в том, что мы хотели бы отфильтровать результаты и агрегировать только часть документов или искать определенные части набора результатов после того, как мы выполним группировку. Допустим, в нашей коллекции мы хотим агрегировать документы, в которых отдел равен продажам. Запрос будет таким.
db.mycollection.aggregate([{
$match: {
dept_name: 'Sales'
}
}])
$group
Как следует из названия, $group группирует документы на основе некоторого ключа. Допустим, мы хотим сгруппировать сотрудников по названию их отдела и найти количество сотрудников в каждом отделе.
db.mycollection.aggregate([{
$group: {
_id: '$dept_name',
no_of_employees: {
$sum: 1
}
}
}])
$sort
Сортировка помогает вам сортировать данные после агрегации, в порядке возрастания или убывания в соответствии с вашими потребностями. Допустим, мы хотим сгруппировать название отдела в порядке возрастания и узнать количество сотрудников.
db.mycollection.aggregate([{
$group: {
_id: '$dept_name',
no_of_employees: {
$sum: 1
}
}
}, {
$sort: {
_id: 1
}
}])
$skip и $limit
$skip и $limit, как следует из названий, пропускают и ограничивают соответственно, когда мы делаем простой поиск. Пропускать и ограничивать не имеет смысла, если мы сначала не отсортируем, иначе результат не определен.
Сначала мы пропускаем записи, а затем ограничиваем их.
db.mycollection.aggregate([{
$group: {
_id: '$dept_name',
no_of_employees: {
$sum: 1
}
}
}, {
$sort: {
_id: 1
}
}, {
$skip: 2
}, {
$limit: 1
}])
$unwind
Как мы знаем, в MongoDB документы могут иметь массивы. Сложно сгруппировать что-то внутри массива. $unwind сначала отсоединяет данные массива, а затем, по сути, снова их объединяет таким образом, что мы можем выполнять вычисления группировки на нем.
Допустим, у нас есть такой документ.
{
a: somedata,
b: someotherdata,
c: [arr1, arr2, arr3]
}
After $unwind on‘ c’, we will get three documents.
{
a: somedata,
b: someotherdata,
c: arr1
} {
a: somedata,
b: someotherdata,
c: arr2
} {
a: somedata,
b: someotherdata,
c: arr3
}
Освоив эти этапы, вы сможете использовать всю мощь конвейера агрегации MongoDB для эффективного анализа и обработки данных.