Учебники

MongoDB — Агрегация

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