W MongoDB $slice
Operator potoku agregacji zwraca podzbiór tablicy.
Aby użyć $slice
, określasz liczbę elementów do zwrócenia z tablicy. Możesz także określić pozycję początkową, dla której należy pobrać podzbiór z tablicy.
Przykład
Załóżmy, że mamy kolekcję o nazwie test
z następującym dokumentem:
{ "_id" : 1, "data" : [ "Aardvark", "Buffalo", "Cat", "Dog", "Horse", "Gorilla", "Zebra" ] }
Możemy użyć $slice
pobrać podzbiór z tablicy w data
pole.
Dodatnia liczba całkowita
Dostarczenie pojedynczej wartości dodatniej określa pozycję początkową od początku tablicy.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 3 ] }
}
}
]
)
Wynik:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
W tym przypadku podaliśmy dodatnią liczbę 3
, a więc pierwsze trzy elementy zostały zwrócone z tablicy.
Ujemna liczba całkowita
Podanie pojedynczej wartości ujemnej określa pozycję początkową od koniec tablicy.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -3 ] }
}
}
]
)
Wynik:
{ "result" : [ "Horse", "Gorilla", "Zebra" ] }
W tym przypadku zwróciliśmy ostatnie trzy elementy z tablicy.
Pamiętaj, że nie możesz określić ujemnej liczby całkowitej, gdy określasz również pozycję początkową. Więcej na ten temat później.
Określ pozycję startową
Masz również możliwość określenia pozycji początkowej. Aby to zrobić, podaj kolejną liczbę całkowitą przed drugą.
Dodatnia liczba całkowita
Oto przykład użycia dodatniej liczby całkowitej dla pozycji początkowej:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 2, 3 ] }
}
}
]
)
Wynik:
{ "result" : [ "Cat", "Dog", "Horse" ] }
W tym przypadku określiliśmy pozycję początkową 2
i plasterek o rozmiarze 3
.
Zauważ, że tablice są liczone od zera, a zatem nasza dodatnia liczba całkowita 2
spowodowało, że operacja plastra rozpoczęła się od trzeciej pozycji.
Ujemna liczba całkowita
Oto przykład użycia ujemnej liczby całkowitej dla pozycji początkowej:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -4, 3 ] }
}
}
]
)
Wynik:
{ "result" : [ "Dog", "Horse", "Gorilla" ] }
W tym przypadku określiliśmy -4
, co skutkowało operacją plastra odliczającą cztery miejsca wstecz od końca.
Plasterki nadwymiarowe
Dostarczenie rozmiaru wycinka, który jest większy niż dostępne elementy w tablicy, powoduje zwrócenie tylko pozostałych elementów tablicy.
Przykład:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -1, 3 ] }
}
}
]
)
Wynik:
{ "result" : [ "Zebra" ] }
Tutaj określiliśmy, że powinny zostać zwrócone trzy elementy, mimo że rozpoczęliśmy tylko jedną pozycję wstecz od końca tablicy. W tym przypadku został zwrócony tylko jeden element (ostatni w tablicy).
Pozycja początkowa poza zasięgiem
Podanie pozycji początkowej, która jest poza zakresem tablicy, może zwrócić niektóre elementy lub pustą tablicę. Wszystko zależy od podanych wartości.
Oto przykład, który zwraca pustą tablicę:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 10, 3 ] }
}
}
]
)
Wynik:
{ "result" : [ ] }
Zwróciło to pustą tablicę, ponieważ pozycja początkowa to 10
, mimo że jest tylko 7
elementy w tablicy (a liczba wyszłaby od 0
do 6
).
Jeśli jednak podamy wartość ujemną, która jest większa niż rozmiar tablicy, wycinek zaczyna się od początku tablicy.
Przykład:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -10, 3 ] }
}
}
]
)
Wynik:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
Ujemny plasterek z pozycją początkową
Jak wspomniano, nie możesz określić ujemnej liczby całkowitej, gdy określasz również pozycję początkową. Spowoduje to błąd.
Przykład:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 4, -3 ] }
}
}
]
)
Wynik:
Error: command failed: { "ok" : 0, "errmsg" : "Third argument to $slice must be positive: -3", "code" : 28729, "codeName" : "Location28729" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1