Definição
Sintaxe
{ $bottom: { sortBy: { <field1>: <sort order>, <field2>: <sort order> ... }, output: <expression> } }
Campo | necessidade | Descrição |
|---|---|---|
sortBy | Obrigatório | Especifica a ordem dos resultados, com sintaxe semelhante a |
saída | Obrigatório | Representa a saída de cada elemento no grupo e pode ser qualquer expressão. |
Comportamento
Valores nulos e ausentes
Considere a seguinte agregação que retorna o documento inferior de um grupo de pontuações:
$bottomnão filtra valores nulos.$bottomconverte valores ausentes em nulo.
db.aggregate( [ { $documents: [ { playerId: "PlayerA", gameId: "G1", score: 1 }, { playerId: "PlayerB", gameId: "G1", score: 2 }, { playerId: "PlayerC", gameId: "G1", score: 3 }, { playerId: "PlayerD", gameId: "G1"}, { playerId: "PlayerE", gameId: "G1", score: null } ] }, { $group: { _id: "$gameId", playerId: { $bottom: { output: [ "$playerId", "$score" ], sortBy: { "score": -1 } } } } } ] )
Neste exemplo:
$documentscria os documentos literais que contêm as pontuações dos jogadores.$groupagrupa os documentos porgameId. Este exemplo tem apenas umgameId,G1.PlayerDtem uma pontuação ausente ePlayerEtem um nuloscore. Esses valores são considerados nulos.Os campos
playerIdescoresão especificados comooutput : ["$playerId"," $score"]e retornados como valores de array.Especifique a ordem de classificação com
sortBy: { "score": -1 }.PlayerDePlayerEempatado para o elemento inferior.PlayerDé retornado como oscoreinferior.Para ter um comportamento de quebra de vínculo mais determinístico para vários valores nulos, adicione mais campos ao
sortBy.
[ { _id: 'G1', playerId: [ 'PlayerD', null ] } ]
Restrições
Suporte para função de janela e expressão de agregação
$bottom não é suportado como uma expressão de agregação.
$bottom é suportado como um window operator.
Considerações sobre o limite de memória
Os pipelines de agregação que chamam $bottom estão sujeitos ao limite de 100 MB. Se esse limite for excedido para um grupo individual, a agregação falhará com um erro.
Exemplos
Considere uma collection gamescores com os seguintes documentos:
db.gamescores.insertMany([ { playerId: "PlayerA", gameId: "G1", score: 31 }, { playerId: "PlayerB", gameId: "G1", score: 33 }, { playerId: "PlayerC", gameId: "G1", score: 99 }, { playerId: "PlayerD", gameId: "G1", score: 1 }, { playerId: "PlayerA", gameId: "G2", score: 10 }, { playerId: "PlayerB", gameId: "G2", score: 14 }, { playerId: "PlayerC", gameId: "G2", score: 66 }, { playerId: "PlayerD", gameId: "G2", score: 80 } ])
Encontre o fundo Score
Você pode usar o acumulador $bottom para encontrar a pontuação mais baixa em um único jogo.
db.gamescores.aggregate( [ { $match : { gameId : "G1" } }, { $group: { _id: "$gameId", playerId: { $bottom: { output: [ "$playerId", "$score" ], sortBy: { "score": -1 } } } } } ] )
O exemplo de pipeline:
Utiliza
$matchpara filtrar os resultados em um únicogameId. Neste caso,G1.Utiliza
$grouppara agrupar os resultados porgameId. Neste caso,G1.Especifica os campos que são de saída para
$bottomcomoutput : ["$playerId"," $score"].Utiliza
sortBy: { "score": -1 }para classificar as pontuações em ordem decrescente.Usa
$bottompara retornar a pontuação inferior do jogo.
A operação retorna os seguintes resultados:
[ { _id: 'G1', playerId: [ 'PlayerD', 1 ] } ]
Encontrando o Score inferior em vários jogos
Você pode usar o acumulador $bottom para encontrar o score inferior em cada jogo.
db.gamescores.aggregate( [ { $group: { _id: "$gameId", playerId: { $bottom: { output: [ "$playerId", "$score" ], sortBy: { "score": -1 } } } } } ] )
O exemplo de pipeline:
Utiliza
$grouppara agrupar os resultados porgameId.Usa
$bottompara retornar ascoreinferior de cada jogo.Especifica os campos que são de saída para
$bottomcomoutput : ["$playerId", "$score"].Utiliza
sortBy: { "score": -1 }para classificar as pontuações em ordem decrescente.
A operação retorna os seguintes resultados:
[ { _id: 'G2', playerId: [ 'PlayerA', 10 ] }, { _id: 'G1', playerId: [ 'PlayerD', 1 ] } ]