В MongoDB, $arrayElemAt
Операторът на конвейера за агрегиране връща елемента с посочения индекс на масива.
Приема два аргумента;
- Масивът
- Индексът на елемента, който искате да извлечете
Пример
Да предположим, че имаме колекция, наречена posts
със следния документ:
{ "_id" : 1, "title" : "Hello World!", "body" : "This is a test post for the purposes of testing", "tags" : [ "html", "css", "sql", "xml" ], "status" : null }
В този документ tags
полето съдържа масив.
Можем да използваме $arrayElemAt
оператор за връщане на елемент от масив с конкретен индекс.
Пример:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 0 ] }
}
}
])
Резултат:
{ "_id" : 1, "tag" : "html" }
В този случай връщаме първия елемент от масива. Масивите са базирани на нула и така 0
се отнася до първия елемент в масива.
Съвет:От MongoDB 4.4 можем също да използваме $first
оператор за връщане на първия елемент в масив.
Ето пример за получаване на втория елемент:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 1 ] }
}
}
])
Резултат:
{ "_id" : 1, "tag" : "css" }
Отрицателни стойности за индекса
Можете да предоставите отрицателна стойност за втория аргумент. Когато направите това, $arrayElemAt
брои обратно от края на масива.
Пример:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", -1 ] }
}
}
])
Резултат:
{ "_id" : 1, "tag" : "xml" }
В този случай получаваме последния елемент в масива.
От MongoDB 4.4 можем също да използваме $last
оператор, за да получите последния елемент от масива.
Комбиниране с други оператори
Можете да използвате $arrayElemAt
с други оператори, за да получите резултатите, от които се нуждаете.
Ето пример за комбинирането му с $binarySize
оператор за връщане на размера на конкретен елемент от масива.
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: { $arrayElemAt: [ "$tags", 0 ] } }
}
}
])
Резултат:
{ "_id" : 1, "tagsSize" : 4 }