Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

$last (operador de array)

Nesta página

  • Definição
  • Sintaxe
  • Comportamento
  • Exemplo
  • Saiba mais
$last

Novidades na versão 4.4.

Retorna o último elemento de uma array.

Observação

Desambiguação

Esta página descreve o operador da array $last . Para o acumulador de agregação do $last , consulte $last (aggregation accumulator).

O operador $last tem a seguinte sintaxe:

{ $last: <expression> }

O <expression> pode ser qualquer expressão válida, desde que resolva para uma array, nula ou ausente. Para mais informações sobre expressões, consulte Expressões.

O operador $last é um apelido para a seguinte expressão $arrayElemAt :

{ $arrayElemAt: [ <array expression>, -1 ] }

Operando válido para $last deve resultar em uma array, nula ou ausente.

  • Se o operando for resolvido para uma array não vazia, $last retornará o último elemento da array:

  • Se o operando for resolvido em uma array vazia [], $last não retornará um valor.

  • Se o operando for nulo ou estiver ausente, $last retornará nulo.

Por exemplo, criar uma collection de teste example1 com os seguintes documentos:

db.example1.insertMany([
{ "_id" : 1, "x" : [ 1, 2, 3 ] }, // Non-empty array
{ "_id" : 2, "x" : [ [ ] ] }, // Non-empty array
{ "_id" : 3, "x" : [ null ] }, // Non-empty array
{ "_id" : 4, "x" : [ ] }, // Empty array
{ "_id" : 5, "x" : null }, // Is null
{ "_id" : 6 } // Is Missing
])

Em seguida, o seguinte adiciona um novo campo lastElem cujo valor é derivado da aplicação do operador $last ao campo x :

db.example1.aggregate([
{ $addFields: { lastElem: { $last: "$x" } } }
])

O operador retorna os seguintes documentos:

{ "_id" : 1, "x" : [ 1, 2, 3 ], "lastElem" : 3 }
{ "_id" : 2, "x" : [ [ ] ], "lastElem" : [ ] }
{ "_id" : 3, "x" : [ null ], "lastElem" : null }
{ "_id" : 4, "x" : [ ] } // No output
{ "_id" : 5, "x" : null, "lastElem" : null }
{ "_id" : 6, "lastElem" : null }

Se o operando não for resolvido para uma matriz, nulo ou ausente, a operação de agregação como um todo apresentará erro.

Por exemplo, criar uma collection de teste example2 com os seguintes documentos:

db.example2.insertMany([
{ "_id" : 1, "x" : [ 1, 2, 3 ] },
{ "_id" : 2, "x" : 2 }, // x is not an array/null or missing
])

Em seguida, a seguinte operação de agregação retorna um erro devido ao documento { "_id" : 2, "x" : 2 } :

db.example2.aggregate( { $addFields: { lastElem: { $last: "$x" } } } )

Ou seja, a operação retorna o seguinte:

2020-01-20T21:12:26.713-05:00 E QUERY [js] uncaught exception: Error: command failed: {
"ok" : 0,
"errmsg" : "$last's argument must be an array, but is double",
"code" : 28689,
"codeName" : "Location28689"
} : aggregate failed :

Criar uma collection de amostra runninglog com os seguintes documentos:

db.runninglog.insertMany([
{ "_id" : 1, "team" : "Anteater", log: [ { run: 1, distance: 8 }, { run2: 2, distance: 7.5 }, { run: 3, distance: 9.2 } ] },
{ "_id" : 2, "team" : "Bears", log: [ { run: 1, distance: 18 }, { run2: 2, distance: 17 }, { run: 3, distance: 16 } ] },
{ "_id" : 3, "team" : "Cobras", log: [ { run: 1, distance: 2 } ] }
])

A seguinte agregação utiliza o operador $first e $last na array log para recuperar as informações da primeira execução e da última execução:

db.runninglog.aggregate([
{ $addFields: { firstrun: { $first: "$log" }, lastrun: { $last: "$log" } } }
])

A operação retorna os seguintes resultados:

{ "_id" : 1, "team" : "Anteater", "log" : [ { "run" : 1, "distance" : 8 }, { "run2" : 2, "distance" : 7.5 }, { "run" : 3, "distance" : 9.2 } ],
"firstrun" : { "run" : 1, "distance" : 8 }, "lastrun" : { "run" : 3, "distance" : 9.2 } }
{ "_id" : 2, "team" : "Bears", "log" : [ { "run" : 1, "distance" : 18 }, { "run2" : 2, "distance" : 17 }, { "run" : 3, "distance" : 16 } ],
"firstrun" : { "run" : 1, "distance" : 18 }, "lastrun" : { "run" : 3, "distance" : 16 } }
{ "_id" : 3, "team" : "Cobras", "log" : [ { "run" : 1, "distance" : 2 } ],
"firstrun" : { "run" : 1, "distance" : 2 }, "lastrun" : { "run" : 1, "distance" : 2 } }

Para calcular a alteração entre a primeira e a última distâncias, a operação a seguir usa $cond e $size operadores para calcular a diferença (ou seja, $subtract) as duas distâncias se houver dois ou mais elementos na array log :

db.runninglog.aggregate([
{ $addFields: { firstrun: { $first: "$log" }, lastrun: { $last: "$log" } } },
{ $project: { team: 1, progress:
{
$cond: {
if: { $gt: [ { $size:"$log" }, 1 ] } ,
then: { $subtract: [ "$lastrun.distance", "$firstrun.distance"] },
else: "Not enough data." }
}
}}
])

A operação retorna os seguintes documentos:

{ "_id" : 1, "team" : "Anteater", "progress" : 1.1999999999999993 }
{ "_id" : 2, "team" : "Bears", "progress" : -2 }
{ "_id" : 3, "team" : "Cobras", "progress" : "Not enough data." }

Por padrão, mongosh usa o ponto double de 64bits para números. Para melhorar a precisão, você pode usar o NumberDecimal .

Voltar

$last