MongoDB - Пример агрегирования и группы
В этом руководстве мы покажем вам, как использовать агрегатную функцию MongoDB для группировки документов (данных).
1. Тестовые данные
Данные в формате JSON, показывает хостинг-провайдер для сайта.
website.json
{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" } { "_id" : 2, "domainName" : "test2.com", "hosting" : "aws.amazon.com"} { "_id" : 3, "domainName" : "test3.com", "hosting" : "aws.amazon.com" } { "_id" : 4, "domainName" : "test4.com", "hosting" : "hostgator.com" } { "_id" : 5, "domainName" : "test5.com", "hosting" : "aws.amazon.com" } { "_id" : 6, "domainName" : "test6.com", "hosting" : "cloud.google.com" } { "_id" : 7, "domainName" : "test7.com", "hosting" : "aws.amazon.com" } { "_id" : 8, "domainName" : "test8.com", "hosting" : "hostgator.com" } { "_id" : 9, "domainName" : "test9.com", "hosting" : "cloud.google.com" } { "_id" : 10, "domainName" : "test10.com", "hosting" : "godaddy.com" }
Импортирует в коллекцию «веб-сайт».
> mongoimport -d testdb -c website --file website.json
connected to: 127.0.0.1
Mon Jan 13 14:30:22.662 imported 10 objects
Note
Если коллекция существует, добавьте параметр--upsert
для переопределения данных.
> mongoimport -d testdb -c website --file website.json --upsert
2. Пример группировки
Используетdb.collection.aggregate
и$group
для группировки данных.
2.1 В следующем примере группируются по полю «хостинг» и отображается общая сумма каждого хостинга.
> db.website.aggregate( { $group : {_id : "$hosting", total : { $sum : 1 }} } );
Выход
{ "result" : [ { "_id" : "godaddy.com", "total" : 1 }, { "_id" : "cloud.google.com", "total" : 2 }, { "_id" : "aws.amazon.com", "total" : 4 }, { "_id" : "hostgator.com", "total" : 3 } ], "ok" : 1 }
Эквивалентный SQL.
SELECT hosting, SUM(hosting) AS total FROM website GROUP BY hosting
2.2 Добавить сортировку с помощью$sort
.
> db.website.aggregate( { $group : {_id : "$hosting", total : { $sum : 1 }} }, { $sort : {total : -1} } );
Выход - Вывести «итого» в порядке убывания. Для возрастания используется$sort : {total : 1}
.
{ "result" : [ { "_id" : "aws.amazon.com", "total" : 4 }, { "_id" : "hostgator.com", "total" : 3 }, { "_id" : "cloud.google.com", "total" : 2 }, { "_id" : "godaddy.com", "total" : 1 } ], "ok" : 1 }
2.3 Добавить условие$match
, группы по «хостингу» только для «aws.amazon.com».
> db.website.aggregate( { $match : {hosting : "aws.amazon.com"} }, { $group : { _id : "$hosting", total : { $sum : 1 } } } );
Выход
{ "result" : [ { "_id" : "aws.amazon.com", "total" : 4 } ], "ok" : 1 }
More Examples
Обратитесь к этому официальномуMongoDB Aggregation guide для более подробных примеров агрегирования и группировки.
3. Экспортирует результат группировки в CSV или JSON
Часто нам нужно экспортировать результаты группировки в формате CSV или JSON. Чтобы решить эту проблему, вставляет результаты группы в новую коллекцию и экспортирует новую коллекцию черезmongoexport
.
3.1 Устанавливает результаты группы в переменную. В этом случае имя переменной «groupdata».
> var groupdata = db.website.aggregate( { $group : {_id : "$hosting", total : { $sum : 1 }} }, { $sort : {total : -1} } );
3.2 Вставляетgroupdata.toArray()
в новую коллекцию.
> db.websitegroup.insert(groupdata.toArray()); > db.websitegroup.find().pretty() { "_id" : "aws.amazon.com", "total" : 4 } { "_id" : "hostgator.com", "total" : 3 } { "_id" : "cloud.google.com", "total" : 2 } { "_id" : "godaddy.com", "total" : 1 } >
3.3 Экспортирует коллекцию «Группа веб-сайтов» в файл csv.
c:\> mongoexport -d testdb -c websitegroup -f _id,total -o group.csv --csv connected to: 127.0.0.1 exported 4 records
group.csv
_id,total "aws.amazon.com",4.0 "cloud.google.com",2.0 "godaddy.com",1.0 "hostgator.com",3.0
3.4 Экспортирует коллекцию «Группа веб-сайтов» в файл JSON.
c:\> mongoexport -d testdb -c websitegroup -o group.json connected to: 127.0.0.1 exported 4 records
group.json
{ "_id" : "aws.amazon.com", "total" : 4 } { "_id" : "cloud.google.com", "total" : 2 } { "_id" : "godaddy.com", "total" : 1 } { "_id" : "hostgator.com", "total" : 3 }
4. Операция большой сортировки
Changed in version 2.6 - Прочтите этоMemory Restrictions
В MongoDB сортировка в памяти имеет ограничение в 100 МБ, для выполнения большой сортировки вам нужно включить параметрallowDiskUse
для записи данных во временный файл для сортировки.
Чтобы избежать ошибкиsort exceeded memory limit, включите опциюallowDiskUse
.
db.website.aggregate( [ {$group : {_id : "$hosting", total : { $sum : 1 }}}, {$sort : {total : -1}} ], {allowDiskUse: true} );