No MongoDB, o
$arrayElemAt
operador de pipeline de agregação retorna o elemento no índice de matriz especificado. Ele aceita dois argumentos;
- A matriz
- O índice do elemento que você deseja recuperar
Exemplo
Suponha que tenhamos uma coleção chamada
posts
com o seguinte documento:{ "_id" : 1, "title" : "Hello World!", "body" : "This is a test post for the purposes of testing", "tags" : [ "html", "css", "sql", "xml" ], "status" : null }
Neste documento, as
tags
campo contém uma matriz. Podemos usar o
$arrayElemAt
operador para retornar um elemento de matriz em um índice específico. Exemplo:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 0 ] }
}
}
])
Resultado:
{ "_id" : 1, "tag" : "html" }
Nesse caso, retornamos o primeiro elemento do array. As matrizes são baseadas em zero e, portanto,
0
refere-se ao primeiro elemento na matriz. Dica:A partir do MongoDB 4.4, também podemos usar o
$first
operador para retornar o primeiro elemento em uma matriz. Aqui está um exemplo de como obter o segundo elemento:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 1 ] }
}
}
])
Resultado:
{ "_id" : 1, "tag" : "css" }
Valores negativos para o índice
Você pode fornecer um valor negativo para o segundo argumento. Ao fazer isso,
$arrayElemAt
conta para trás a partir do final da matriz. Exemplo:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", -1 ] }
}
}
])
Resultado:
{ "_id" : 1, "tag" : "xml" }
Nesse caso, obtemos o último elemento da matriz.
A partir do MongoDB 4.4, também podemos usar o
$last
operador para obter o último elemento da matriz. Combinando com outros operadores
Você pode usar
$arrayElemAt
com outros operadores para produzir os resultados que você precisa. Aqui está um exemplo de combinação com o
$binarySize
operador para retornar o tamanho de um elemento de array específico. db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: { $arrayElemAt: [ "$tags", 0 ] } }
}
}
])
Resultado:
{ "_id" : 1, "tagsSize" : 4 }