MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Operador de pipeline de agregação do MongoDB $last


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 retorna null .

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 de null .

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 o player 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.