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 }