Операции агрегации обрабатывают записи данных и возвращают вычисленные результаты. Операции агрегации группируют значения из нескольких документов вместе и могут выполнять различные операции над сгруппированными данными для возврата одного результата. В 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 — используется для размотки документа, использующего массивы. При использовании массива данные являются своего рода предварительно объединенными, и эта операция будет отменена для повторного получения отдельных документов. Таким образом, на этом этапе мы увеличим количество документов для следующего этапа.