W MongoDB $arrayElemAt
Operator potoku agregacji zwraca element o określonym indeksie tablicy.
Przyjmuje dwa argumenty;
- Tablica
- Indeks elementu, który chcesz pobrać
Przykład
Załóżmy, że mamy kolekcję o nazwie posts
z następującym dokumentem:
{ "_id" : 1, "title" : "Hello World!", "body" : "This is a test post for the purposes of testing", "tags" : [ "html", "css", "sql", "xml" ], "status" : null }
W tym dokumencie tags
pole zawiera tablicę.
Możemy użyć $arrayElemAt
operator zwracający element tablicy pod określonym indeksem.
Przykład:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 0 ] }
}
}
])
Wynik:
{ "_id" : 1, "tag" : "html" }
W takim przypadku zwracamy pierwszy element tablicy. Tablice są liczone od zera, więc 0
odnosi się do pierwszego elementu w tablicy.
Wskazówka:z MongoDB 4.4 możemy również użyć $first
operator zwracający pierwszy element tablicy.
Oto przykład pobierania drugiego elementu:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 1 ] }
}
}
])
Wynik:
{ "_id" : 1, "tag" : "css" }
Wartości ujemne dla indeksu
Możesz podać wartość ujemną dla drugiego argumentu. Kiedy to zrobisz, $arrayElemAt
odlicza wstecz od końca tablicy.
Przykład:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", -1 ] }
}
}
])
Wynik:
{ "_id" : 1, "tag" : "xml" }
W tym przypadku otrzymujemy ostatni element tablicy.
Od MongoDB 4.4 możemy również użyć $last
operatora, aby uzyskać ostatni element tablicy.
Łączenie z innymi operatorami
Możesz użyć $arrayElemAt
z innymi operatorami, aby uzyskać żądane wyniki.
Oto przykład połączenia go z $binarySize
operator zwracający rozmiar określonego elementu tablicy.
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: { $arrayElemAt: [ "$tags", 0 ] } }
}
}
])
Wynik:
{ "_id" : 1, "tagsSize" : 4 }