$bottom (aggregation accumulator)
Nesta página
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
Consider the following aggregation that returns the bottom document from a group of scores:
$bottom
não filtra valores nulos.$bottom
converte 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:
$documents
cria os documentos literais que contêm as pontuações dos jogadores.$group
agrupa os documentos porgameId
. Este exemplo tem apenas umgameId
,G1
.PlayerD
tem uma pontuação ausente ePlayerE
tem umascore
nula. Estes valores são considerados nulos.Os campos
playerId
escore
são especificados comooutput : ["$playerId"," $score"]
e retornados como valores de array.Especifique a ordem de classificação com
sortBy: { "score": -1 }
.PlayerD
andPlayerE
tied for the bottom element.PlayerD
is returned as the bottomscore
.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 é aceito como uma expressão de aggregation.
$bottom
é suportado como 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 } ])
Find the Bottom Score
You can use the $bottom
accumulator to find the bottom score in a
single game.
db.gamescores.aggregate( [ { $match : { gameId : "G1" } }, { $group: { _id: "$gameId", playerId: { $bottom: { output: [ "$playerId", "$score" ], sortBy: { "score": -1 } } } } } ] )
O exemplo de pipeline:
Utiliza
$match
para filtrar os resultados em um únicogameId
. Neste caso,G1
.Utiliza
$group
para agrupar os resultados porgameId
. Neste caso,G1
.Especifica os campos que são de saída para
$bottom
comoutput : ["$playerId"," $score"]
.Utiliza
sortBy: { "score": -1 }
para classificar as pontuações em ordem decrescente.Uses
$bottom
to return the bottom score for the game.
A operação retorna os seguintes resultados:
[ { _id: 'G1', playerId: [ 'PlayerD', 1 ] } ]
Finding the Bottom Score
Across Multiple Games
You can use the $bottom
accumulator to find the bottom score
in each game.
db.gamescores.aggregate( [ { $group: { _id: "$gameId", playerId: { $bottom: { output: [ "$playerId", "$score" ], sortBy: { "score": -1 } } } } } ] )
O exemplo de pipeline:
Utiliza
$group
para agrupar os resultados porgameId
.Uses
$bottom
to return the bottomscore
for each game.Especifica os campos que são de saída para
$bottom
comoutput : ["$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 ] } ]