O MongoDB 4.4 introduziu o
$last
operador de pipeline de agregação. Este operador retorna o último elemento em uma matriz.
Exemplo
Suponha que tenhamos uma coleção chamada players com os seguintes documentos:
{ "_id" :1, "player" :"Homer", "scores" :[ 1, 5, 3 ] }{ "_id" :2, "player" :"Marge", "scores" :[ 8, 17, 18 ] }{ "_id" :3, "player" :"Bart", "scores" :[ 15, 11, 8 ] }
Podemos ver que cada documento tem uma
scores
campo que contém uma matriz. Podemos usar
$last
para retornar o último elemento de cada uma dessas matrizes. Exemplo:
db.players.aggregate([
{
$project: {
"lastScore": {
$last: "$scores"
}
}
}
])
Resultado:
{ "_id" :1, "lastScore" :3 }{ "_id" :2, "lastScore" :18 }{ "_id" :3, "lastScore" :8 }
Podemos ver que o último elemento do array foi retornado para cada documento.
Isso é o equivalente a usar o
$arrayElemAt
operador com um valor de -1
:db.players.aggregate([
{
$project: {
"firstScore": { $arrayElemAt: [ "$scores", -1 ] }
}
}
])
Matrizes vazias
Se você fornecer um array vazio,
$last
não retornará um valor. Suponha que inserimos o seguinte documento em nossa coleção:
{ "_id" :4, "player" :"Farnsworth", "scores" :[ ] }
Vamos executar o código novamente:
db.players.aggregate([
{
$project: {
"lastScore": {
$last: "$scores"
}
}
}
])
Resultado:
{ "_id" :1, "lastScore" :3 }{ "_id" :2, "lastScore" :18 }{ "_id" :3, "lastScore" :8 }{ "_id" :4 }
Nesse caso, o documento 4 não retornou nenhum valor para o array. Ele nem retornou o nome do campo.
Valores nulos e ausentes
Se o operando for nulo ou ausente,$last
retornanull
.
Suponha que inserimos o seguinte documento:
{ "_id" :5, "player" :"Meg", "scores" :null }
Vamos executar o código novamente:
db.players.aggregate([ { $project: { "lastScore": { $last: "$scores" } } } ])
Resultado:
{ "_id" :1, "lastScore" :3 }{ "_id" :2, "lastScore" :18 }{ "_id" :3, "lastScore" :8 }{ "_id" :4 }{ "_id" :5, "lastScore" :null }
Desta vez ele retornou o campo com um valor denull
.
Operando inválido
O operando para$last
deve resolver para uma matriz, nula ou ausente. Fornecer um operando inválido resulta em erro.
Para demonstrar isso, vamos tentar usar$last
contra oplayer
campo (que não é um array):
db.players.aggregate([ { $project: { "lastPlayer": { $last: "$player" } } } ])
Resultado:
Erro:comando falhou:{ "ok":0, "errmsg":"O argumento de $last deve ser uma matriz, mas é uma string", "code":28689, "codeName":"Location28689"}:agregado falhou :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:618:17example @sqldat.com/mongo/shell/assert.js:708:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1046:12@( shell):1:1
Como esperado, retornou um erro.