I MongoDB, $arrayElemAt
aggregeringspipeline-operatorn returnerar elementet vid det angivna arrayindexet.
Den godtar två argument;
- Arrayen
- Indexet för elementet du vill hämta
Exempel
Anta att vi har en samling som heter posts
med följande dokument:
{ "_id" : 1, "title" : "Hello World!", "body" : "This is a test post for the purposes of testing", "tags" : [ "html", "css", "sql", "xml" ], "status" : null }
I det här dokumentet, tags
fältet innehåller en array.
Vi kan använda $arrayElemAt
operator för att returnera ett matriselement vid ett specifikt index.
Exempel:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 0 ] }
}
}
])
Resultat:
{ "_id" : 1, "tag" : "html" }
I det här fallet returnerar vi det första arrayelementet. Arrayer är nollbaserade, och så 0
refererar till det första elementet i arrayen.
Tips:Från MongoDB 4.4 kan vi också använda $first
operatorn för att returnera det första elementet i en array.
Här är ett exempel på att få det andra elementet:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 1 ] }
}
}
])
Resultat:
{ "_id" : 1, "tag" : "css" }
Negativa värden för indexet
Du kan ange ett negativt värde för det andra argumentet. När du gör detta, $arrayElemAt
räknar baklänges från slutet av arrayen.
Exempel:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", -1 ] }
}
}
])
Resultat:
{ "_id" : 1, "tag" : "xml" }
I det här fallet får vi det sista elementet i arrayen.
Från MongoDB 4.4 kan vi också använda $last
operatorn för att hämta det sista matriselementet.
Kombinera med andra operatörer
Du kan använda $arrayElemAt
med andra operatörer för att få de resultat du behöver.
Här är ett exempel på att kombinera det med $binarySize
operatorn för att returnera storleken på ett specifikt arrayelement.
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: { $arrayElemAt: [ "$tags", 0 ] } }
}
}
])
Resultat:
{ "_id" : 1, "tagsSize" : 4 }