MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $arrayElemAt

In MongoDB, il $arrayElemAt l'operatore della pipeline di aggregazione restituisce l'elemento in corrispondenza dell'indice di matrice specificato.

Accetta due argomenti;

  • L'array
  • L'indice dell'elemento che vuoi recuperare

Esempio

Supponiamo di avere una raccolta chiamata posts con il seguente documento:

{
	"_id" : 1,
	"title" : "Hello World!",
	"body" : "This is a test post for the purposes of testing",
	"tags" : [
		"html",
		"css",
		"sql",
		"xml"
	],
	"status" : null
}

In questo documento, i tags contiene un array.

Possiamo usare $arrayElemAt operatore per restituire un elemento dell'array in corrispondenza di un indice specifico.

Esempio:

db.posts.aggregate([
  {
    $project: {
      "tag": { $arrayElemAt: [ "$tags", 0 ] }
    }
  }
])

Risultato:

{ "_id" : 1, "tag" : "html" }

In questo caso, restituiamo il primo elemento dell'array. Gli array sono a base zero, quindi 0 fa riferimento al primo elemento dell'array.

Suggerimento:da MongoDB 4.4, possiamo anche utilizzare $first per restituire il primo elemento di una matrice.

Ecco un esempio per ottenere il secondo elemento:

db.posts.aggregate([
  {
    $project: {
      "tag": { $arrayElemAt: [ "$tags", 1 ] }
    }
  }
])

Risultato:

{ "_id" : 1, "tag" : "css" }

Valori negativi per l'indice

È possibile fornire un valore negativo per il secondo argomento. Quando lo fai, $arrayElemAt conta all'indietro dalla fine dell'array.

Esempio:

db.posts.aggregate([
  {
    $project: {
      "tag": { $arrayElemAt: [ "$tags", -1 ] }
    }
  }
])

Risultato:

{ "_id" : 1, "tag" : "xml" }

In questo caso, otteniamo l'ultimo elemento nell'array.

Da MongoDB 4.4, possiamo anche usare $last operatore per ottenere l'ultimo elemento dell'array.

Combinazione con altri operatori

Puoi usare $arrayElemAt con altri operatori per produrre i risultati di cui hai bisogno.

Ecco un esempio di combinazione con $binarySize operatore per restituire la dimensione di un elemento dell'array specifico.

db.posts.aggregate([
  {
    $project: {
      "tagsSize": { $binarySize: { $arrayElemAt: [ "$tags", 0 ] } }
    }
  }
])

Risultato:

{ "_id" : 1, "tagsSize" : 4 }