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

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


O MongoDB 4.4 introduziu o $first operador de pipeline de agregação.

Este operador retorna o primeiro 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 $first para retornar o primeiro elemento de cada uma dessas matrizes.

Exemplo:
db.players.aggregate([ 
  {
    $project: {
        "firstScore": { 
          $first: "$scores" 
        }
    }
  } 
]) 

Resultado:
{ "_id" :1, "firstScore" :1 }{ "_id" :2, "firstScore" :8 }{ "_id" :3, "firstScore" :15 }

Podemos ver que o primeiro elemento do array foi retornado para cada documento.

Isso é o equivalente a usar o $arrayElemAt operador com valor zero (0 ):
db.players.aggregate([
  {
    $project: {
      "firstScore": { $arrayElemAt: [ "$scores", 0 ] }
    }
  }
]) 

Matrizes vazias


Se você fornecer um array vazio, $first 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: {
        "firstScore": { 
          $first: "$scores" 
        }
    }
  } 
]) 

Resultado:
{ "_id" :1, "firstScore" :1 }{ "_id" :2, "firstScore" :8 }{ "_id" :3, "firstScore" :15 }{ "_id" :4 } 
Nesse caso, o documento 4 não retornou nenhum valor para o array. Na verdade, nem retornou o nome do campo.

Valores nulos e ausentes


Se o operando for nulo ou ausente, $first retorna null .

Suponha que inserimos o seguinte documento:
{ "_id" :5, "player" :"Meg", "scores" :null }

Vamos executar o código novamente:
db.players.aggregate([ 
  {
    $project: {
        "firstScore": { 
          $first: "$scores" 
        }
    }
  } 
]) 

Resultado:
{ "_id" :1, "firstScore" :1 }{ "_id" :2, "firstScore" :8 }{ "_id" :3, "firstScore" :15 }{ "_id" :4 }{ "_id" :5, "firstScore" :null }

Desta vez ele retornou o campo com um valor de null .

Operando inválido


O operando para $first deve resolver para uma matriz, nula ou ausente. Fornecer um operando inválido resulta em erro.

Para demonstrar isso, vamos tentar usar $first contra o player campo (que não é um array):
db.players.aggregate([ 
  {
    $project: {
        "firstPlayer": { 
          $first: "$player" 
        }
    }
  } 
]) 

Resultado:
Erro:comando falhou:{ "ok":0, "errmsg":"O argumento de $first 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.