In MongoDB is de $arrayElemAt aggregatiepijplijnoperator retourneert het element met de opgegeven array-index.
Het accepteert twee argumenten;
- De array
- De index van het element dat u wilt ophalen
Voorbeeld
Stel dat we een verzameling hebben met de naam posts met het volgende document:
{
"_id" : 1,
"title" : "Hello World!",
"body" : "This is a test post for the purposes of testing",
"tags" : [
"html",
"css",
"sql",
"xml"
],
"status" : null
}
In dit document worden de tags veld bevat een array.
We kunnen de $arrayElemAt . gebruiken operator om een array-element op een specifieke index te retourneren.
Voorbeeld:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 0 ] }
}
}
]) Resultaat:
{ "_id" : 1, "tag" : "html" }
In dit geval retourneren we het eerste array-element. Arrays zijn gebaseerd op nul, en dus 0 verwijst naar het eerste element in de array.
Tip:vanaf MongoDB 4.4 kunnen we ook de $first . gebruiken operator om het eerste element in een array te retourneren.
Hier is een voorbeeld van het verkrijgen van het tweede element:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 1 ] }
}
}
]) Resultaat:
{ "_id" : 1, "tag" : "css" } Negatieve waarden voor de index
U kunt een negatieve waarde opgeven voor het tweede argument. Wanneer u dit doet, $arrayElemAt telt achteruit vanaf het einde van de array.
Voorbeeld:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", -1 ] }
}
}
]) Resultaat:
{ "_id" : 1, "tag" : "xml" } In dit geval krijgen we het laatste element in de array.
Vanaf MongoDB 4.4 kunnen we ook de $last . gebruiken operator om het laatste array-element te krijgen.
Combineren met andere operators
U kunt $arrayElemAt . gebruiken met andere operators om de gewenste resultaten te produceren.
Hier is een voorbeeld van het combineren met de $binarySize operator om de grootte van een specifiek array-element te retourneren.
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: { $arrayElemAt: [ "$tags", 0 ] } }
}
}
]) Resultaat:
{ "_id" : 1, "tagsSize" : 4 }