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 :example@sqldat.com/mongo/shell/utils.js:25:13example@sqldat.com/mongo/shell/assert.js:18:14example@sqldat.com/mongo/shell/assert.js:618:17example @sqldat.com/mongo/shell/assert.js:708:16example@sqldat.com/mongo/shell/db.js:266:5example@sqldat.com/mongo/shell/collection.js:1046:12@( shell):1:1
Como esperado, retornou um erro.