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
retornanull
.
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 denull
.
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 oplayer
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.