В 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 }