English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MongoDB базовый курс

MongoDB продвинутый курс

Агрегация в MongoDB

Агрегационные операции обрабатывают записи данных и возвращают вычисленные результаты. Агрегационные операции группируют значения из множества документов и позволяют выполнять различные операции с группированными данными, чтобы вернуть единственный результат. В SQL count(*) и group by эквивалентны агрегации MongoDB.

Aggregate() метод

Для агрегации в MongoDB вам следует использовать aggregate() Метод.

Грамматика

aggregate()Основная грамматика метода выглядит следующим образом-

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

Онлайн пример

В наборе у вас есть следующие данные-

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB不是SQL数据库',
   by_user: 'oldtoolbag.com',
   url: 'https://ru.oldtoolbag.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No SQL数据库是非常快的',
   by_user: 'oldtoolbag.com',
   url: 'https://ru.oldtoolbag.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   _id: ObjectId(7df78ad8902e)
   title: 'Neo4j Overview', 
   description: 'Neo4j 是No SQL数据库',
   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}}}])
{ "_id" : "oldtoolbag.com", "num_tutorial" : 2 }
{ "_id" : "Neo4j", "num_tutorial" : 1 }
>

Эквивалентный запрос SQL для вышеуказанного примера будет select by_user, count(*) from mycol group by by_user.

В предыдущем примере мы уже группировали по полюby_userДокументы были сгруппированы, и при每组ировании по пользователю, значение sum会增加. Вот список доступных выражений агрегации.

ВыражениеОписаниеПример
$sumРассчитать сумму.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avgРассчитать среднее значениеdb.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$minПолучить минимальное значение всех значений в наборе.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$maxПолучить максимальное значение всех значений в наборе.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$pushВ документе результатов вставить значение в массив.db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSetВставка значения в массив в документ результатов, не создавая дубликата.db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$firstПолучение данных первого документа по сортировке ресурсов.db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$lastПолучение данных последнего документа по сортировке ресурсов.db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

Концепция потока

Поток в Unix и Linux, как правило, используется для передачи вывода текущей команды в качестве параметра для следующей команды.

Агрегационный поток MongoDB передаёт результат документа в следующий поток处理后.

Выражение: обрабатывает входные документы и выводит их. Выражение является без��态ным и может использоваться только для вычисления текущих документов в потоке агрегации, не обрабатывая других документов.

Вот несколько常用的 операций в контексте агрегационной рамки:

  • $project:изменяет структуру входных документов. Может использоваться для переименования, добавления или удаления полей, а также для создания вычисленных результатов и вложенных документов.

  • $match:используется для фильтрации данных, чтобы выводить только документы, соответствующие условиям. Параметр $match использует стандартные операции запроса MongoDB.

  • $limit:используется для ограничения количества документов, возвращаемых MongoDB в потоке агрегации.

  • $skip:пропускает заданное количество документов в потоке агрегации и возвращает оставшиеся документы.

  • $unwind:распознает определенный массив типа поля документа на多条, каждое из которых содержит значение из массива.

  • $group:группирует документы в наборе, что можно использовать для получения результатов статистики.

  • $sort:сортирует входные документы и выводит их.

  • $geoNear:вывод отсортированных документов, приближенных к определенной географической точке.

instance оператора потока

1、instance $project

db.article.aggregate(
    { $project : {
        title : 1 ,
        author : 1 ,
    }}
 );

Таким образом, в результате останутся только поля _id, title и author, по умолчанию поле _id включено, если вы хотите не включать его, можно так:

db.article.aggregate(
    { $project : {
        _id : 0 ,
        title : 1 ,
        author : 1
    }});

2. Пример $match

db.articles.aggregate( [
                        { $match : { score : { $gt : 70, $lte : 90 } } },
                        { $group: { _id: null, count: { $sum: 1 } } }
                       ] );

$match используется для получения записей с оценкой больше 70 и меньше или равной 90, затем соответствующие записи отправляются на следующий этап обработки с помощью оператора $group в трубопроводе.

3. Пример $skip

db.article.aggregate(
    { $skip : 5 });

После обработки с помощью оператора $skip первые пять документов были "отфильтрованы".