Операции агрегации обрабатывают записи данных и возвращают вычисленные результаты. Операции агрегации группируют значения из нескольких документов вместе и могут выполнять различные операции над сгруппированными данными для возврата одного результата. В SQL count (*) и с group by является эквивалентом агрегации mongodb.
Метод агрегата ()
Для агрегирования в MongoDB вы должны использовать метод aggregate () .
Синтаксис
Основной синтаксис метода aggregate () выглядит следующим образом:
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
пример
В коллекции у вас есть следующие данные —
{
_id: ObjectId(7df78ad8902c)
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
_id: ObjectId(7df78ad8902d)
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 10
},
{
_id: ObjectId(7df78ad8902e)
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
},
Теперь из вышеупомянутой коллекции, если вы хотите отобразить список с указанием количества учебников, написанных каждым пользователем, вы будете использовать следующий метод aggregate ():
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
"result" : [
{
"_id" : "tutorials point",
"num_tutorial" : 2
},
{
"_id" : "Neo4j",
"num_tutorial" : 1
}
],
"ok" : 1
}
>
Sql эквивалентный запрос для вышеупомянутого варианта использования будет выбран by_user, count (*) из группы mycol by by_user .
В приведенном выше примере мы сгруппировали документы по полю by_user, и при каждом появлении by_user предыдущее значение суммы увеличивается. Ниже приведен список доступных выражений агрегации.
| выражение | Описание | пример |
|---|---|---|
| $ сумма | Суммирует определенное значение из всех документов в коллекции. | db.mycol.aggregate ([{$ group: {_id: «$ by_user», num_tutorial: {$ sum: «$ likes»}}}]) |
| $ ср | Вычисляет среднее значение всех заданных значений из всех документов в коллекции. | db.mycol.aggregate ([{$ group: {_id: «$ by_user», num_tutorial: {$ avg: «$ likes»}}}]) |
| $ мин | Получает минимум соответствующих значений из всех документов в коллекции. | db.mycol.aggregate ([{$ group: {_id: «$ by_user», num_tutorial: {$ min: «$ likes»}}}]) |
| $ макс | Получает максимум соответствующих значений из всех документов в коллекции. | db.mycol.aggregate ([{$ group: {_id: «$ by_user», num_tutorial: {$ max: «$ likes»}}}]) |
| $ толчок | Вставляет значение в массив в результирующий документ. | db.mycol.aggregate ([{$ group: {_id: «$ by_user», url: {$ push: «$ url»}}}]) |
| $ addToSet | Вставляет значение в массив в результирующий документ, но не создает дубликаты. | db.mycol.aggregate ([{$ group: {_id: «$ by_user», url: {$ addToSet: «$ url»}}}]) |
| $ первый | Получает первый документ из исходных документов в соответствии с группировкой. Как правило, это имеет смысл только вместе с некоторым ранее примененным этапом «$ sort». | db.mycol.aggregate ([{$ group: {_id: «$ by_user», first_url: {$ first: «$ url»}}}]) |
| $ последний | Получает последний документ из исходных документов в соответствии с группировкой. Как правило, это имеет смысл только вместе с некоторым ранее примененным этапом «$ sort». | db.mycol.aggregate ([{$ group: {_id: «$ by_user», last_url: {$ last: «$ url»}}}]) |
Концепция трубопровода
В команде UNIX конвейер оболочки означает возможность выполнить операцию для некоторого ввода и использовать вывод в качестве ввода для следующей команды и так далее. MongoDB также поддерживает ту же концепцию в структуре агрегации. Существует множество возможных этапов, и каждый из них берется как набор документов в качестве входных данных и создает результирующий набор документов (или конечный результирующий документ JSON в конце конвейера). Это может затем использоваться для следующего этапа и так далее.
Ниже приведены возможные этапы в структуре агрегации —
$ project — используется для выбора некоторых определенных полей из коллекции.
$ match — это операция фильтрации, которая может уменьшить количество документов, которые передаются в качестве входных данных для следующего этапа.
$ group — выполняет фактическую агрегацию, как описано выше.
$ sort — сортирует документы.
$ skip — при этом можно пропустить вперед в списке документов для заданного количества документов.
$ limit — ограничивает количество документов для просмотра заданным числом, начиная с текущих позиций.
$ unwind — используется для размотки документа, использующего массивы. При использовании массива данные являются своего рода предварительно объединенными, и эта операция будет отменена для повторного получения отдельных документов. Таким образом, на этом этапе мы увеличим количество документов для следующего этапа.