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

Aggregação 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://pt.oldtoolbag.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: 'ObjectId('7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No SQL数据库是非常快的',
   by_user: 'oldtoolbag.com',
   url: 'https://pt.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 }
>

A consulta SQL equivalente aos casos acima será select by_user, count(*) from mycol group by by_user.

No exemplo acima, já agrupamos pelo campoby_userOs documentos foram agrupados e, a cada vez que são agrupados por usuário, o valor de sum anterior aumenta. A seguir está a lista de expressões de agregação disponíveis.

ExpressãoDescriçãoExemplo
$sumCalcular o total.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avgCalcular a médiadb.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$minObter o valor mínimo correspondente a todos os documentos na coleção.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$maxObter o valor máximo correspondente a todos os documentos na coleção.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$pushInserir um valor em um array no documento de resultado.db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSetInsere um valor em um array no documento de resultado, sem criar cópias.db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$firstObtém os dados do primeiro documento com base na ordenação dos documentos de recursos.db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$lastObtém os dados do último documento com base na ordenação dos documentos de recursos.db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

Conceito de pipeline

O pipeline é geralmente usado no Unix e Linux para passar a saída do comando atual como argumento para o próximo comando.

O pipeline de agregação do MongoDB passa os documentos MongoDB por um pipeline e depois passa o resultado para o próximo pipeline. As operações de pipeline podem ser repetidas.

Expressão: Processa o documento de entrada e gera uma saída. A expressão é inativa, pode ser usada apenas para calcular o documento atual no pipeline de agregação e não pode processar outros documentos.

Aqui vamos apresentar alguns operadores comuns no framework de agregação:

  • $project:Modifica a estrutura do documento de entrada. Pode ser usado para renomear, adicionar ou remover campos, e também para criar resultados de cálculo e documentos aninhados.

  • $match:Usado para filtrar dados, retornando apenas documentos que atendem aos critérios. $match usa operações de consulta padrão do MongoDB.

  • $limit:Usado para limitar o número de documentos retornados pelo pipeline de agregação do MongoDB.

  • $skip:Pula um número específico de documentos no pipeline de agregação e retorna os documentos restantes.

  • $unwind:Divide um campo do tipo array em várias entradas, cada uma contendo um valor do array.

  • $group:Gera grupos de documentos dentro da coleção, útil para resultados de estatísticas.

  • $sort:Ordena os documentos de entrada e os retorna.

  • $geoNear:Saída de documentos ordenados próximos de uma determinada localização.

instância de operador de canal

1instância $project

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

Dessa forma, o resultado contém apenas os campos _id, title e author, por padrão o campo _id é incluído, se você quiser omitir _id, pode fazer assim:

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

2.$match instância

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

$match usado para obter documentos com pontuação maior que70 é menor ou igual a90 registros, em seguida, enviar os registros que atendem aos critérios para o próximo operador de pipeline $group.

3.$skip instância

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

Após a operação de pipeline $skip, os cinco primeiros documentos foram "filtrados".