English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Агрегационные операции обрабатывают записи данных и возвращают вычисленные результаты. Агрегационные операции группируют значения из множества документов и позволяют выполнять различные операции с группированными данными, чтобы вернуть единственный результат. В SQL count(*) и group by эквивалентны агрегации MongoDB.
Для агрегации в 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:вывод отсортированных документов, приближенных к определенной географической точке.
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 первые пять документов были "отфильтрованы".