DevGang
Авторизоваться

Конвейер агрегации 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 для эффективного анализа и обработки данных.

Источник:

#MongoDB
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу