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 }