MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $arrayElemAt

Dans MongoDB, le $arrayElemAt l'opérateur de pipeline d'agrégation renvoie l'élément à l'index de tableau spécifié.

Il accepte deux arguments ;

  • Le tableau
  • L'index de l'élément que vous souhaitez récupérer

Exemple

Supposons que nous ayons une collection appelée posts avec le document suivant :

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

Dans ce document, les tags le champ contient un tableau.

Nous pouvons utiliser le $arrayElemAt opérateur pour renvoyer un élément de tableau à un index spécifique.

Exemple :

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

Résultat :

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

Dans ce cas, nous renvoyons le premier élément du tableau. Les tableaux sont basés sur zéro, et donc 0 fait référence au premier élément du tableau.

Astuce :A partir de MongoDB 4.4, on peut aussi utiliser le $first opérateur pour renvoyer le premier élément d'un tableau.

Voici un exemple d'obtention du deuxième élément :

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

Résultat :

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

Valeurs négatives pour l'index

Vous pouvez fournir une valeur négative pour le deuxième argument. Lorsque vous faites cela, $arrayElemAt compte à rebours à partir de la fin du tableau.

Exemple :

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

Résultat :

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

Dans ce cas, nous obtenons le dernier élément du tableau.

Depuis MongoDB 4.4, on peut aussi utiliser le $last opérateur pour obtenir le dernier élément du tableau.

Combiner avec d'autres opérateurs

Vous pouvez utiliser $arrayElemAt avec d'autres opérateurs pour produire les résultats dont vous avez besoin.

Voici un exemple de combinaison avec le $binarySize opérateur pour renvoyer la taille d'un élément de tableau spécifique.

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

Résultat :

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