Definição
aggregateExecuta operação de agregação utilizando o pipeline de agregação. O pipeline permite que os usuários processem dados de uma coleção ou de outra fonte com uma sequência de manipulações baseadas em estágios.
Dica
Em
mongosh, este comando também pode ser executado por meio dos métodos auxiliaresdb.aggregate()edb.collection.aggregate()ou com o método auxiliarwatch().Os métodos auxiliares são práticos para os usuários
mongosh, mas podem não retornar o mesmo nível de informações que os comandos do banco de dados. Nos casos em que a praticidade não for necessária ou os campos de retorno adicionais forem necessários, use o comando de banco de dados.
Compatibilidade
Esse comando está disponível em implantações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
Importante
Esse comando tem suporte limitado nos clusters M0 e Flex. Para saber mais, consulte Comandos não suportados.
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Sintaxe
Alterado na versão 5.0.
O comando tem a seguinte sintaxe:
db.runCommand( { aggregate: "<collection>" || 1, pipeline: [ <stage>, <...> ], explain: <boolean>, allowDiskUse: <boolean>, cursor: <document>, maxTimeMS: <int>, bypassDocumentValidation: <boolean>, readConcern: <document>, collation: <document>, hint: <string or document>, comment: <any>, writeConcern: <document>, let: <document> // Added in MongoDB 5.0 } )
Campos de comando
O comando aggregate usa os seguintes campos como argumentos:
Campo | Tipo | Descrição | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| string | O nome da collection ou visualização que atua como entrada para o aggregation pipeline. Use | ||||||||||
| array | Uma array de estágios aggregation pipeline que processam e transformam o fluxo de documentos como parte do aggregation pipeline. | ||||||||||
| booleano | Opcional. Especifica para devolver as informações sobre o processamento do pipeline. Não disponível em transações com vários documentos. | ||||||||||
| booleano | Opcional. Utilize esta opção para substituir o
A partir do MongoDB 6.0, se Para detalhes, consulte As mensagens de registro do criador de perfil e as mensagens de registro de diagnóstico incluem um indicador | ||||||||||
| documento | Especifique um documento que contenha opções que controlem a criação do objeto cursor. Você deve utilizar o comando
| ||||||||||
| non-negative integer | Opcional. Especifica um limite de tempo em milissegundos. Se você não especificar um valor para O MongoDB encerra as operações que excedem o limite de tempo alocado usando o mesmo mecanismo de | ||||||||||
| booleano | |||||||||||
| documento | Opcional. Especifica a read concern. A opção Os possíveis níveis de read concern são:
Para obter mais informações sobre os read concern, consulte Níveis de read concern. O estágio O estágio | ||||||||||
| documento | Opcional. Especifica o agrupamento a ser usado para a operação. A colocação permite que os usuários especifiquem regras específicas do idioma para comparação de strings, como regras para letras maiúsculas e marcas de acento. A opção de agrupamento tem a seguinte sintaxe: Ao especificar agrupamento, o campo Se o agrupamento não for especificado, mas a coleção tiver um agrupamento padrão (consulte Se nenhum agrupamento for especificado para a coleção ou para as operações, o MongoDB usa a comparação binária simples usada nas versões anteriores para comparações de strings. Você não pode especificar vários agrupamentos para uma operação. Por exemplo, você não pode especificar agrupamentos diferentes por campo ou, se estiver realizando uma busca com uma classificação, não poderá usar um agrupamento para a busca e outro para a classificação. | ||||||||||
| string ou documento | Opcional. O índice a ser usado para a aggregation. O índice está na collection/visualização inicial em relação à qual a aggregation é executada. Especifique o índice pelo nome do índice ou pelo documento de especificação do índice. O | ||||||||||
| any | Opcional. Um comentário fornecido pelo usuário para anexar a este comando. Depois de definido, esse comentário aparece junto com os registros desse comando nos seguintes locais:
Um comentário pode ser qualquer tipo BSON válido (string, inteiro, objeto, array etc). Qualquer comentário definido em um comando | ||||||||||
| documento | Opcional. Um documento que expressa a write concern a ser usado com o estágio
| ||||||||||
| documento | Opcional. Especifica um documento com uma lista de variáveis. Isso permite que você melhore a legibilidade do comando separando as variáveis do texto da query. A sintaxe do documento é: A variável é definida para o valor retornado pela expressão e não pode ser alterada posteriormente. Para acessar o valor de uma variável no comando, use o prefixo de dois cifrões ( Para usar uma variável para filtrar resultados em um estágio Para um exemplo completo utilizando Novidades na versão 5.0. |
Você deve utilizar o comando aggregate com a opção cursor a menos que o comando inclua a opção explain.
Para indicar um cursor com o tamanho de lote padrão, especifique
cursor: {}.Para indicar um cursor com um tamanho de lote não padrão, use
cursor: { batchSize: <num> }.
Para obter mais informações sobre o pipeline de agregação, consulte:
Sessões
Para cursores criados dentro de uma sessão, você não pode chamar getMore fora da sessão.
Da mesma forma, para cursores criados fora de uma sessão, você não pode chamar getMore dentro de uma sessão.
Tempo-limite de inatividade da sessão
Os drivers MongoDB e mongosh associam todas as operações a uma sessão do servidor, com exceção das operações de gravação não reconhecidas. No caso das operações não associadas explicitamente a uma sessão (ou seja, usando Mongo.startSession()), os drivers MongoDB e mongosh criam uma sessão implícita e a associam à operação.
Se uma sessão estiver ociosa por mais de 30 minutos, o servidor MongoDB marcará essa sessão como expirada e poderá fechá-la a qualquer momento. Quando o servidor MongoDB fecha a sessão, ele também elimina todas as operações em andamento e abre os cursores associados à sessão. Isso inclui cursores configurados com noCursorTimeout() ou maxTimeMS() com mais de 30 minutos.
Para operações que retornam um cursor, se o cursor puder ficar ocioso por mais de 30 minutos, emita a operação em uma sessão explícita usando Mongo.startSession() e atualize periodicamente a sessão usando o comando refreshSessions. Consulte Tempo limite de inatividade da sessão para obter mais informações.
Transações
aggregate pode ser usado dentro de transações distribuídas.
No entanto, os seguintes estágios não são permitidos nas transações:
Você também não pode especificar a opção explain.
Para cursores criados fora de uma transação, você não pode chamar
getMoredentro da transação.Para cursores criados em uma transação, não é possível chamar
getMorefora da transação.
Importante
Na maioria dos casos, uma transação distribuída incorre em um custo de desempenho maior do que as gravações de um único documento, e a disponibilidade de transações distribuídas não deve substituir o design eficaz do esquema. Em muitos cenários, o modelo de dados desnormalizado (documentos e arrays incorporados) continuará a ser ideal para seus dados e casos de uso. Ou seja, para muitos cenários, modelar seus dados adequadamente minimizará a necessidade de transações distribuídas.
Para considerações adicionais sobre o uso de transações (como limite de tempo de execução e limite de tamanho do oplog), consulte também Considerações de produção.
Desconexão do cliente
Para aggregate a operação que não inclua os estágios $out ou $merge:
Se o cliente que emitiu aggregate se desconectar antes da conclusão da operação, o MongoDB marcará aggregate para encerramento usando killOp.
Configurações de query
Novidades na versão 8.0.
Você pode usar as configurações de query para definir dicas de índice, definir filtros de descarte de operação e outros campos. As configurações se aplicam à forma de query em todo o cluster. O cluster mantém as configurações após o fechamento.
O otimizador de query usa as configurações da query como uma entrada adicional durante o planejamento da query, o que afeta o plano selecionado para executar a query. Você também pode usar as configurações de query para bloquear uma forma de query.
Para adicionar configurações de query e explorar exemplos, consulte setQuerySettings.
Você pode adicionar configurações de query para comandosfind, distinct e aggregate.
As configurações de consulta têm mais funcionalidade e são preferidas em relação aos filtros de índice obsoletos.
Para remover as configurações de query, use removeQuerySettings. Para obter as configurações de consulta, use um estágio $querySettings em um pipeline de agregação .
Stable API
Ao usar a API estável V1:
Você não pode utilizar as seguintes etapas em um comando
aggregate:Não inclua o campo
explainem um comandoaggregate. Se fizer isso, o servidor retornará um erro APIStrictError .Ao usar o estágio
$collStats, você só pode usar o campocount. Nenhum outro campo$collStatsestá disponível.
Exemplo
Você deve utilizar o comando aggregate com a opção cursor a menos que o comando inclua a opção explain.
Para indicar um cursor com o tamanho de lote padrão, especifique
cursor: {}.Para indicar um cursor com um tamanho de lote não padrão, use
cursor: { batchSize: <num> }.
Ao invés de executar o aggregate comando diretamente, a maioria dos usuários deve utilizar o db.collection.aggregate() assistente mongosh do fornecido no ou o assistente equivalente em seu driver.
Exceto para os dois primeiros exemplos que demonstram a sintaxe de comando, os exemplos nesta página utilizam o auxiliar db.collection.aggregate().
Os exemplos nesta página usam dados do conjunto de dados de amostra sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.
Agregar Dados com Pipeline Multi-Estágio
A coleção movies no banco de dados sample_mflix contém documentos como estes:
Observação
Os documentos na coleção movies contêm campos adicionais não mostrados aqui.
{ title: 'The Shawshank Redemption', year: 1994, genres: [ 'Crime', 'Drama' ], runtime: 142, imdb: { rating: 9.3, votes: 1521105, id: 111161 }, directors: [ 'Frank Darabont' ], cast: [ 'Tim Robbins', 'Morgan Freeman', 'Bob Gunton', 'William Sadler' ], }, { title: 'The Godfather', year: 1972, genres: [ 'Crime', 'Drama' ], runtime: 175, imdb: { rating: 9.2, votes: 1038358, id: 68646 }, directors: [ 'Francis Ford Coppola' ], cast: [ 'Marlon Brando', 'Al Pacino', 'James Caan', 'Richard S. Castellano' ] }, { title: 'Pulp Fiction', year: 1994, genres: [ 'Crime', 'Drama' ], runtime: 154, imdb: { rating: 8.9, votes: 1179033, id: 110912 }, directors: [ 'Quentin Tarantino' ], cast: [ 'Tim Roth', 'Amanda Plummer', 'Laura Lovelace', 'John Travolta' ] }, { title: 'Forrest Gump', year: 1994, genres: [ 'Drama', 'Romance' ], runtime: 142, imdb: { rating: 8.8, votes: 1087227, id: 109830 }, directors: [ 'Robert Zemeckis' ], cast: [ 'Tom Hanks', 'Rebecca Williams', 'Sally Field', 'Michael Conner Humphreys' ], }, { title: 'Inception', year: 2010, genres: [ 'Action', 'Sci-Fi', 'Thriller' ], runtime: 148, imdb: { rating: 8.8, votes: 1294646, id: 1375666 }, directors: [ 'Christopher Nolan' ], cast: [ 'Leonardo DiCaprio', 'Joseph Gordon-Levitt', 'Ellen Page', 'Tom Hardy' ], }
O exemplo a seguir executa uma operação aggregate na movies collection para calcular a contagem de cada gênero distinto que aparece na collection.
db.runCommand( { aggregate: "movies", pipeline: [ { $project: { genres: 1 } }, { $unwind: "$genres" }, { $group: { _id: "$genres", count: { $sum : 1 } } } ], cursor: { } } )
mongoshEm, essa operação pode usar o assistente, como no exemplo a db.collection.aggregate() seguir:
db.movies.aggregate( [ { $project: { genres: 1 } }, { $unwind: "$genres" }, { $group: { _id: "$genres", count: { $sum: 1 } } } ] )
Use $currentOp em um Banco de Dados Administrativo
O exemplo a seguir executa um pipeline com dois estágios no banco de dados admin. O primeiro estágio executa a operação$currentOp e o segundo estágio filtra os resultados dessa operação.
db.adminCommand( { aggregate : 1, pipeline : [ { $currentOp : { allUsers : true, idleConnections : true } }, { $match : { shard : "shard01" } } ], cursor : { } })
Observação
O comando aggregate não especifica uma coleção. Em vez disso, assume o formato {aggregate: 1}. Isso ocorre porque o estágio inicial $currentOp não extrai entrada de uma coleção. Ele produz seus próprios dados que o resto do pipeline usa.
O novo auxiliar dedb.aggregate()foi adicionado para ajudar na execução de aggregations sem collection como esta. A aggregation acima também pode ser executada como este exemplo.
Informações de Retorno sobre a Operação de Agregação
A seguinte operação de aggregation define o campo opcional explain para true para retornar informações sobre a operação de aggregation.
db.comments.aggregate( [ { $match: { date: { $gte: ISODate("2015-01-01") } } }, { $group: { _id: "$movie_id", commentCount: { $sum: 1 } } }, { $sort: { commentCount: -1 } } ], { explain: true } )
Observação
A saída de explicação está sujeita a alterações entre as versões.
Interação com allowDiskUseByDefault
Estágios de pipeline que exigem mais de 100 megabytes de memória para executar arquivos temporários de gravação no disco por padrão. Esses arquivos temporários duram durante a execução do pipeline e podem influenciar o espaço de armazenamento em sua instância.
Somente find e aggregate comandos podem substituir o parâmetro allowDiskUseByDefault por um ou outro:
Usando
{ allowDiskUse: true }para permitir a gravação de arquivos temporários no disco quandoallowDiskUseByDefaultestiver definido comofalseUsando
{ allowDiskUse: false }para proibir a gravação de arquivos temporários no disco quandoallowDiskUseByDefaultestiver definido comotrue
As mensagens de registro do criador de perfil e as mensagens de registro de diagnóstico incluem um indicador usedDisk se algum estágio de agregação gravou dados em arquivos temporários devido a restrições de memória.
Dados Agregados Especificando o Tamanho do Lote
Para especificar um tamanho de lote inicial, especifique o batchSize no campo cursor, como no seguinte exemplo:
db.theaters.aggregate( [ { $match: { "location.address.state": "NY" } }, { $group: { _id: "$location.address.city", theaterCount: { $sum: 1 } } }, { $sort: { theaterCount: -1 } }, { $limit: 2 } ], { cursor: { batchSize: 0 } } )
O documento do { cursor: { batchSize: 0 } }, que especifica o tamanho do tamanho do lote inicial, indica um primeiro lote vazio. Esse tamanho de lote é útil para retornar rapidamente um cursor ou uma mensagem de falha sem realizar um trabalho significativo no lado do servidor.
Para especificar o tamanho do lote para operações subsequentes do getMore (após o lote inicial), utilize o campo batchSize ao executar o comando getMore.
Especificar um agrupamento
A colocação permite que os usuários especifiquem regras específicas do idioma para comparação de strings, como regras para letras maiúsculas e marcas de acento.
A seguinte operação de agregação retorna títulos de todos os filmes francês na coleção movies do banco de dados do sample_mflix e especifica o agrupamento do fr:
db.movies.aggregate( [ { $match: {"countries": "France", "languages": "French"} }, { $project: { "title": 1, "_id": 0 } } ], { collation: { locale: "fr", strength: 1 } } )
Para obter descrições sobre os campos de agrupamento, consulte Documento de agrupamento.
Sugerir um Índice
A coleção movies no banco de dados sample_mflix contém documentos semelhantes a estes:
{ title: "The Shawshank Redemption", year: 1994, rated: "R", imdb: { rating: 9.3, votes: 1513145, id: 111161 } }, { title: "The Godfather", year: 1972, rated: "R", imdb: { rating: 9.2, votes: 1038358, id: 68646 } }, { title: "The Dark Knight", year: 2008, rated: "PG-13", imdb: { rating: 9, votes: 1495351, id: 468569 } }, { title: "Forrest Gump", year: 1994, rated: "PG-13", imdb: { rating: 8.8, votes: 1087227, id: 109830 } }
Suponha que os seguintes índices existam na coleção movies:
db.movies.createIndex( { "imdb.rating": 1, year: 1 } )
db.movies.createIndex( { "imdb.rating": 1, rated: 1 } )
A seguinte operação de aggregation inclui a opção hint para forçar o uso do índice especificado:
db.movies.aggregate( [ { $sort: { "imdb.rating": 1 } }, { $match: { rated: "R", "imdb.rating": { $gte: 9.0 } } }, { $sort: { year: -1 } } ], { hint: { "imdb.rating": 1, rated: 1 } } )
Substituir o Padrão Atenção com a Leitura
Para substituir o nível de preocupação de leitura padrão, utilize a opção readConcern. O comando getMore usa o nível readConcern especificado no comando aggregate de origem.
A operação a seguir na movies collection do sample_mflix banco de dados especifica uma preocupação de leitura de para ler a cópia mais recente dos dados confirmados como tendo sido gravados na maioria dos nós."majority"
Importante
Você pode especificar o nível de preocupação de leitura
"majority"para uma agregação que inclui um estágio$out.Independentemente do nível de read concern, os dados mais recentes em um nó podem não refletir a versão mais recente dos dados no sistema.
db.movies.aggregate( [ { $match: { "imdb.rating": { $gte: 8.0 } } }, { $group: { _id: "$rated", avgRating: { $avg: "$imdb.rating" }, count: { $sum: 1 } } }, { $sort: { avgRating: -1 } } ], { readConcern: { level: "majority" } } )
Para garantir que um único thread possa ler suas próprias gravações, use "majority" read concern e "majority" write concern em relação ao primário do conjunto de réplicas.
Usar variáveis em let
Para definir variáveis que você pode acessar em outro lugar no comando, utilize a opção let .
Observação
A coleção movies no banco de dados sample_mflix contém documentos como este:
{ title: "The Shawshank Redemption", year: 1994, rated: "R", imdb: { rating: 9.3, votes: 1513145, id: 111161 }, runtime: 142 }
O exemplo a seguir usa a opção let para definir variáveis que podem ser usadas no pipeline. Essa agregação encontra filmes com altas classificações e longas durações:
db.runCommand( { aggregate: "movies", pipeline: [ { $match: { $expr: { $and: [ { $gte: [ "$imdb.rating", "$$minRating" ] }, { $gte: [ "$runtime", "$$minRuntime" ] } ] } } }, { $project: { title: 1, year: 1, "imdb.rating": 1, runtime: 1 } }, { $sort: { "imdb.rating": -1 } }, { $limit: 3 } ], cursor: {}, let: { minRating: 8.5, minRuntime: 120 } } )