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 }