En MongoDB, el $arrayElemAt
El operador de canalización de agregación devuelve el elemento en el índice de matriz especificado.
Acepta dos argumentos;
- La matriz
- El índice del elemento que desea recuperar
Ejemplo
Supongamos que tenemos una colección llamada posts
con el siguiente documento:
{ "_id" : 1, "title" : "Hello World!", "body" : "This is a test post for the purposes of testing", "tags" : [ "html", "css", "sql", "xml" ], "status" : null }
En este documento, las tags
el campo contiene una matriz.
Podemos usar el $arrayElemAt
operador para devolver un elemento de matriz en un índice específico.
Ejemplo:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 0 ] }
}
}
])
Resultado:
{ "_id" : 1, "tag" : "html" }
En este caso, devolvemos el primer elemento de la matriz. Las matrices están basadas en cero, por lo que 0
se refiere al primer elemento de la matriz.
Sugerencia:desde MongoDB 4.4, también podemos usar $first
operador para devolver el primer elemento de una matriz.
Aquí hay un ejemplo de cómo obtener el segundo elemento:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 1 ] }
}
}
])
Resultado:
{ "_id" : 1, "tag" : "css" }
Valores negativos para el índice
Puede proporcionar un valor negativo para el segundo argumento. Cuando haga esto, $arrayElemAt
cuenta hacia atrás desde el final de la matriz.
Ejemplo:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", -1 ] }
}
}
])
Resultado:
{ "_id" : 1, "tag" : "xml" }
En este caso, obtenemos el último elemento de la matriz.
Desde MongoDB 4.4, también podemos usar $last
operador para obtener el último elemento de la matriz.
Combinar con otros operadores
Puedes usar $arrayElemAt
con otros operadores para producir los resultados que necesita.
Aquí hay un ejemplo de cómo combinarlo con $binarySize
operador para devolver el tamaño de un elemento de matriz específico.
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: { $arrayElemAt: [ "$tags", 0 ] } }
}
}
])
Resultado:
{ "_id" : 1, "tagsSize" : 4 }