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 }