MongoDB - Пример агрегирования и группы

MongoDB - Пример агрегирования и группы

mongodb-group-example

В этом руководстве мы покажем вам, как использовать агрегатную функцию 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}
);