Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

agregado (comando de banco de dados)

aggregate

Executa uma operação de agregação utilizando o pipeline de agregação. O pipeline permite processar dados de uma coleção ou de outra fonte por meio de uma sequência de estágios.

Dica

Emmongosh, este comando também pode ser executado por meio dos métodos de assistentedb.aggregate()edb.collection.aggregate()ou com o método de assistentewatch().

Os métodos assistentes são convenientes 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 conveniência não for necessária ou os campos de retorno adicionais forem necessários, use o comando de banco de dados.

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

Alterado na versão 5.0.

O comando tem a seguinte sintaxe:

db.runCommand(
{
aggregate: "<collection>" || 1,
pipeline: [ <stage>, <...> ],
explain: <boolean>,
allowDiskUse: <boolean>,
allowPartialResults: <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
querySettings: <document> // Added in MongoDB 9.0
}
)

O comando utiliza os seguintes campos como aggregate argumentos:

Campo
Tipo
Descrição

aggregate

string

O nome da collection ou visualização que atua como entrada para o aggregation pipeline. Use 1 para comandos independentes de collection.

pipeline

array

Uma array de estágios aggregation pipeline que processam e transformam o fluxo de documentos como parte do aggregation pipeline.

explain

booleano

Opcional. Especifica para devolver as informações sobre o processamento do pipeline.

Não disponível em transações com vários documentos.

allowDiskUse

booleano

Opcional.

Utilize esta opção para substituir o allowDiskUseByDefault para uma query específica. Você pode usar esta opção para:

  • Proibir o uso do disco em um sistema onde o uso do disco é permitido por padrão.

  • Permitir o uso do disco em um sistema onde o uso do disco é proibido por padrão.

A partir do MongoDB 6.0, se allowDiskUseByDefault estiver configurado como true e o servidor exigir mais de 100 megabytes de memória para um estágio de execução do pipeline, o MongoDB gravará automaticamente arquivos temporários em disco, a menos que a consulta especifique { allowDiskUse: false }.

Para detalhes, consulte allowDiskUseByDefault.

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.

allowPartialResults

booleano

Opcional. Para aggregations executadas por meio de um mongos em uma collection fragmentada, o comando pode retornar resultados parciais em vez de um erro quando um ou mais shards consultados não estão disponíveis. Os comandos getMore subsequentes também podem retornar resultados parciais. O padrão é false, que retorna um erro se um shard consultado não estiver disponível.

Defina allowPartialResults somente no comando aggregate inicial. Você não pode defini-lo em getMore, mas cada getMore herda a configuração do cursor.

Como um shard pode ficar indisponível a qualquer ponto, resultados parciais podem aparecer na resposta aggregate inicial, em uma resposta getMore posterior ou em ambas. Quando um lote omite resultados de shards indisponíveis, a resposta desse lote inclui um campopartialResultsReturned: true . Quando todos os fragmentos consultados estão disponíveis para um lote, a resposta omite partialResultsReturned. partialResultsReturned pode conter somente documentos de shards disponíveis. Não pressupõe que o conjunto de resultados esteja completo quando partialResultsReturned for verdadeiro.

O comando retorna um erro InvalidOptions se o pipeline:

  • Termina em um estágio de gravação, como $out ou $merge.

  • É uma agregação de fluxo de mudança.

  • Contém um estágio do Atlas Search , como $search, $vectorSearch, $rankFusion ou $scoreFusion.

cursor

documento

Especifique um documento que contenha opções que controlem a criação do objeto cursor.

Você deve usar o comando aggregate com cursor a explain opção, a menos que o comando inclua a opção.

  • 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> }.

maxTimeMS

non-negative integer

Opcional.

Especifica um limite de tempo em milissegundos. Se você não especificar um valor para maxTimeMS, as operações não atingirão o tempo limite. Um valor 0 especifica explicitamente o comportamento ilimitado padrão.

O MongoDB encerra as operações que excedem o limite de tempo alocado usando o mesmo mecanismo de db.killOp(). O MongoDB só encerra uma operação em um de seus pontos de interrupção designados.

bypassDocumentValidation

booleano

Opcional. Aplicável somente se você especificar as etapas de aggregation do $out ou $merge.

Habilita o para ignorar a validação de esquema durante a operação. Isso permite inserir documentos que não atendam aos requisitos de aggregate validação.

readConcern

documento

Opcional. Especifica a read concern.

A opção readConcern tem a seguinte sintaxe: readConcern: { level: <value> }

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 $out não pode ser usado em conjunto com preocupação de leitura "linearizable". Se você especificar a preocupação de leitura "linearizable" para db.collection.aggregate(), não poderá incluir o estágio $out no pipeline.

O estágio $merge não pode ser usado em conjunto com a read concern "linearizable". Ou seja, se você especificar "linearizable" read concern para db.collection.aggregate(), não poderá incluir o estágio $merge no pipeline.

collation

documento

Opcional.

Opcional. Especifica a agrupamento para utilizar 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:

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

Ao especificar agrupamento, o campo locale é obrigatório; todos os outros campos de agrupamento são opcionais. Para obter descrições dos campos, consulte Documento de agrupamento.

Se o agrupamento não for especificado, mas a coleção tiver um agrupamento padrão (consulte db.createCollection()), a operação usará o agrupamento especificado para a coleção.

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.

hint

string ou documento

opcional. O índice a ser usado para a agregação. O índice está na coleção ou visualização inicial em relação à qual a agregação é executada.

Especifique o índice pelo nome do índice ou pelo documento de especificação do índice.

O hint não se aplica aos estágios $lookup e $graphLookup.

comment

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 aggregate é herdado por todos os comandos getMore subsequentes executados no cursor aggregate.

writeConcern

documento

Opcional. Um documento que expressa a write concern a ser usado com o estágio $out ou $merge.

$outOmitir para usar a write concern padrão com o estágio $out ou $merge.

let

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 é:

{
<variable_name_1>: <expression_1>,
...,
<variable_name_n>: <expression_n>
}

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 ($$) junto com o nome da variável no formato $$<variable_name>. Por exemplo: $$targetTotal.

Para usar uma variável para filtrar resultados em um estágio $match do pipeline, é necessário acessar a variável dentro do operador $expr.

Para um exemplo completo utilizando let e variáveis, consulte Utilizar Variáveis let no.

Novidade na versão 5.0.

querySettings

documento

Opcional. Configurações de query que se aplicam somente a esta execução do comando. O documento querySettings aceita os seguintes campos:

  • indexHints

  • queryFramework

  • reject

  • comment

  • queryKnobs

  • maxTimeMS

Para obter descrições desses campos, consulte Campos de comando.

O MongoDB não armazena essas configurações no cluster e elas não se aplicam a outras queries com a mesma forma de query. Para definir configurações de query que persistem para uma forma de query, utilize setQuerySettings.

O MongoDB combina as configurações que você passa no comando com quaisquer configurações de query armazenadas no cluster para a mesma forma de query. Se ambas as configurações especificarem o mesmo campo, a configuração do cluster armazenado terá precedência.

Novidades na versão 9.0.

Você deve usar o comando aggregate com cursor a explain opção, a menos que o comando inclua a opção.

  • 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:

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.

Os drivers e do MongoDB associam todas as mongosh operações a uma sessão de servidor , com exceção de operações de gravação não reconhecidas. Para operações não explicitamente associadas a uma sessão (ou seja, uso de ), os drivers do MongoDB Mongo.startSession() 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.

Se o cursor puder ficar ocioso por mais de 30 minutos, emita a operação em uma sessão explícita usando Mongo.startSession(). Atualize periodicamente a sessão usando o comando refreshSessions. Consulte Tempo limite de inatividade da sessão para obter mais informaçõ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 getMore dentro da transação.

  • Para cursores criados em uma transação, não é possível chamar getMore fora 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.

Para operações do aggregate $out $merge que não incluem as etapas ou:

Se o cliente que emitiu aggregate se desconectar antes da conclusão da operação, o MongoDB marcará para aggregate encerramento killOp usando.

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 .

Ao utilizar a API estável 1V, o comando é suportado com as seguintes aggregate exceções:

Você deve usar o comando aggregate com cursor a explain opção, a menos que o comando inclua a opção.

  • 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> }.

Em vez de executar o comando aggregate diretamente, use o assistente do db.collection.aggregate() em mongosh 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 assistente 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.

A coleção movies no banco de dados sample_mflix contém documentos como estes:

Observação

Os document 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 agrega a coleção movies para calcular a contagem de cada gênero distinto:

db.runCommand( {
aggregate: "movies",
pipeline: [
{ $project: { genres: 1 } },
{ $unwind: "$genres" },
{ $group: { _id: "$genres", count: { $sum : 1 } } }
],
cursor: { }
} )

mongoshNo, execute a mesma agregação utilizando o assistente db.collection.aggregate() :

db.movies.aggregate(
[
{ $project: { genres: 1 } },
{ $unwind: "$genres" },
{ $group: { _id: "$genres", count: { $sum: 1 } } }
]
)

O exemplo a seguir executa um pipeline de dois estágios no banco de dados admin. O primeiro estágio executa a operação $currentOp e o segundo estágio aplica o filtro aos resultados.

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 e, em vez disso, assume o formato {aggregate: 1}. O estágio inicial $currentOp não extrai entrada de uma coleção. O estágio produz seus próprios dados para o resto do pipeline usar.

O assistente de db.aggregate() oferece suporte a agregações sem collection como esta. Execute a agregação acima como este exemplo.

O exemplo a seguir define explain para true para retornar informações sobre a agregação.

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.

Estágios de pipeline que exigem mais de 100 megabytes de memória para executar, gravam arquivos temporários em 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 quando allowDiskUseByDefault estiver definido como false

  • Usando { allowDiskUse: false } para proibir a gravação de arquivos temporários no disco quando allowDiskUseByDefault estiver definido como true

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.

Para definir um tamanho de lote inicial, inclua o batchSize no campo cursor:

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 { cursor: { batchSize: 0 } } especifica o tamanho do tamanho do lote inicial e indica um primeiro lote vazio. Isso retorna 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, utilize o batchSize() no mongosh ou o campo batchSize no comando getMore.

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 dos campos de agrupamentos, consulte Documento de agrupamentos.

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 } }
)

Para substituir o nível de preocupação de leitura padrão, use a readConcern opção. O comando usa getMore o readConcern nível especificado no comando de aggregate origem.

A operação a seguir na coleção movies do banco de dados sample_mflix especifica uma read concern de "majority" para ler a cópia mais recente dos dados confirmados como tendo sido gravados na maioria dos nós.

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.

Para definir variáveis que você pode acessar em outro lugar no comando, utilize a opção let .

Observação

Para filtrar os resultados usando uma variável em um estágio do pipeline $match, você deve acessar a variável dentro do operador $expr.

A coleção movies no banco de dados sample_mflix contém document 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 para o pipeline. O exemplo encontra filmes com altas classificações e longos tempos de execução:

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 }
} )