In MongoDB, the $arrayElemAt
aggregation pipeline operator returns the element at the specified array index.
It accepts two arguments;
- The array
- The index of the element you want to retrieve
Example
Suppose we have a collection called posts
with the following 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 this document, the tags
field contains an array.
We can use the $arrayElemAt
operator to return an array element at a specific index.
Example:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 0 ] }
}
}
])
Result:
{ "_id" : 1, "tag" : "html" }
In this case, we return the first array element. Arrays are zero-based, and so 0
refers to the first element in the array.
Tip: From MongoDB 4.4, we can also use the $first
operator to return the first element in an array.
Here’s an example of getting the second element:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 1 ] }
}
}
])
Result:
{ "_id" : 1, "tag" : "css" }
Negative Values for the Index
You can provide a negative value for the second argument. When you do this, $arrayElemAt
counts backwards from the end of the array.
Example:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", -1 ] }
}
}
])
Result:
{ "_id" : 1, "tag" : "xml" }
In this case, we get the last element in the array.
From MongoDB 4.4, we can also use the $last
operator to get the last array element.
Combining with Other Operators
You can use $arrayElemAt
with other operators to produce the results you require.
Here’s an example of combining it with the $binarySize
operator to return the size of a specific array element.
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: { $arrayElemAt: [ "$tags", 0 ] } }
}
}
])
Result:
{ "_id" : 1, "tagsSize" : 4 }