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 }