MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB $arrayElemAt


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 }