sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $arrayElemAt

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 }