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://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ão | Descrição | Exemplo |
---|---|---|
$sum | Calcular o total. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | Calcular a média | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | Obter o valor mínimo correspondente a todos os documentos na coleção. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | Obter o valor máximo correspondente a todos os documentos na coleção. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | Inserir um valor em um array no documento de resultado. | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | Insere um valor em um array no documento de resultado, sem criar cópias. | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | Obté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"}}}]) |
$last | Obté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"}}}]) |
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.
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".