W MongoDB $zakres
Operator potoku agregacji zwraca wygenerowaną sekwencję liczb w tablicy.
Ta sekwencja liczb jest oparta na wprowadzonych przez Ciebie wartościach wejściowych.
Składnia
Składnia wygląda tak:
{ $range:[ , , ] }
Gdzie
Przykład
Załóżmy, że mamy kolekcję o nazwie range
z następującymi dokumentami:
{ "_id" :1, "początek" :0, "koniec" :5 }{ "_id" :2, "początek" :1, "koniec" :5 }
Możemy użyć $zakresu
operatora, aby zwrócić tablicę opartą na wartościach w tych dokumentach.
db.range.aggregate( [ { $match:{ _id:{ $in:[1, 2 ] } } }, { $project:{ _id:0, start:1, end:1, wynik:{ $zakres:[ "$start", "$koniec" ] } } } ])
Wynik:
{ "początek" :0, "koniec" :5, "wynik" :[ 0, 1, 2, 3, 4 ] }{ "początek" :1, "koniec" :5, "wynik" :[ 1, 2, 3, 4 ] }
W tym przypadku nie podaliśmy trzeciego argumentu, więc $range
używa domyślnej wartości kroku 1. Dlatego elementy tablicy zwiększają się o 1.
Dodaj wyraźny przyrost
Możemy dodać trzeci argument, aby jawnie określić, o ile każdy element tablicy powinien się zwiększać.
Załóżmy, że nasza kolekcja zawiera następujące dokumenty:
{ "_id" :3, "początek" :0, "koniec" :5, "krok" :1 }{ "_id" :4, "początek" :0, "koniec" :10, "krok" :2 }{ "_id" :5, "początek" :1, "koniec" :10, "krok" :2 }{ "_id" :6, "początek" :100, "koniec" :150, "krok" :10 }
Te dokumenty mają krok
pole, więc możemy użyć tego pola do zwiększenia wartości dla odpowiedniego dokumentu.
Teraz zastosujmy $range
do tych dokumentów i dołącz krok
pole jako trzeci argument:
db.range.aggregate( [ { $match:{ _id:{ $in:[ 3, 4, 5, 6 ] } } }, { $project:{ _id:0, start:1, koniec:1, krok:1, wynik:{ $zakres:[ "$start", "$koniec", "$krok" ] } } } ])
Wynik:
{ "początek" :0, "koniec" :5, "krok" :1, "wynik" :[ 0, 1, 2, 3, 4 ] }{ "początek" :0, "koniec" :10 , "krok" :2, "wynik" :[ 0, 2, 4, 6, 8 ] }{ "początek" :1, "koniec" :10, "krok" :2, "wynik" :[ 1, 3 , 5, 7, 9 ] }{ "początek" :100, "koniec" :150, "krok" :10, "wynik" :[ 100, 110, 120, 130, 140 ] }
Ujemne wartości kroków
Krok może być wartością ujemną, chociaż należy to zrobić w kontekście dekrementacji z wyższego start
liczba do niższego koniec
numer.
Dodajmy jeszcze kilka dokumentów do naszej kolekcji:
{ "_id" :7, "początek" :0, "koniec" :5, "krok" :-1 }{ "_id" :8, "początek" :5, "koniec" :0, "krok " :-1 }{ "_id" :9, "początek" :0, "koniec" :-5, "krok" :-1 }
Teraz zastosujmy $range
do tych dokumentów:
db.range.aggregate( [ { $match:{ _id:{ $in:[ 7, 8, 9 ] } } }, { $project:{ _id:0, start:1, end:1, krok:1, wynik:{ $zakres:[ "$start", "$koniec", "$krok" ] } } } ])
Wynik:
{ "początek" :0, "koniec" :5, "krok" :-1, "wynik" :[ ] }{ "początek" :5, "koniec" :0, "krok" :-1, "wynik" :[ 5, 4, 3, 2, 1 ] }{ "początek" :0, "koniec" :-5, "krok" :-1, "wynik" :[ 0, -1, -2, -3, -4 ] }
Widzimy, że pierwszy dokument zwrócił pustą tablicę, ponieważ ujemna wartość kroku jest poza zakresem podanym przez start
i koniec
pola.
Jednak kolejne dokumenty generowały zmniejszający się zakres wartości.
Kiedy krok jest zerowy
Wartość kroku musi być niezerową liczbą całkowitą. Zapewnienie kroku 0
zwraca błąd.
Załóżmy, że do naszej kolekcji dodamy następujący dokument:
{ "_id" :10, "początek" :1, "koniec" :5, "krok" :0 }
Oto, co się dzieje, gdy zastosujemy $range
do tego dokumentu:
db.range.aggregate( [ { $match:{ _id:{ $in:[ 10 ] } } }, { $project:{ _id:0, start:1, end:1, wynik:{ $zakres:[ "$start", "$koniec", "$krok" ] } } } ])
Wynik:
Komunikat o błędzie wyraźnie mówi nam, że $zakres wymaga niezerowej wartości kroku
.
Kroki zerowe
Krok nie może być null
albo.
Załóżmy, że mamy następujący dokument:
{ "_id" :11, "początek" :1, "koniec" :5, "krok" :null }
I stosujemy $range
do niego:
db.range.aggregate( [ { $match:{ _id:{ $in:[ 11 ] } } }, { $project:{ _id:0, start:1, end:1, wynik:{ $zakres:[ "$start", "$koniec", "$krok" ] } } } ])
Wynik:
nieprzechwycony wyjątek:Błąd:polecenie nie powiodło się:{ "ok" :0, "errmsg" :"$zakres wymaga wartości kroku numerycznego, znaleziona wartość typu:null", "code" :34447, "codeName" :" Location34447"} :agregacja nie powiodła się :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert .js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js :1058:12@(powłoka)::1:1
To mówi nam, że $range wymaga numerycznej wartości kroku, znalezionej wartości typu:null
.
Zakresy puste
Jeśli start
i/lub koniec
pola są null
, zwracany jest błąd.
Załóżmy, że mamy następujący dokument:
{ "_id" :11, "początek" :1, "koniec" :5, "krok" :null }
I zastosuj $range
do niego:
db.range.aggregate( [ { $match:{ _id:{ $in:[ 11 ] } } }, { $project:{ _id:0, start:1, end:1, wynik:{ $zakres:[ "$start", "$koniec", "$krok" ] } } } ])
Wynik:
nieprzechwycony wyjątek:Błąd:polecenie nie powiodło się:{ "ok" :0, "errmsg" :"$zakres wymaga liczbowej wartości początkowej, znaleziona wartość typu:null", "code" :34443, "codeName" :" Lokalizacja34443"} :agregacja nie powiodła się :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert .js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js :1058:12@(powłoka)::1:1
To mówi nam, że $range wymaga numerycznej wartości początkowej, znaleziona wartość typu:null
.
Podobny komunikat pojawiłby się, gdyby wartość końcowa była null.
Oto dokument z null
wartość końcowa:
{ "_id" :13, "początek" :1, "koniec" :null, "krok" :1 }
Zastosujmy $range
:
db.range.aggregate( [ { $match:{ _id:{ $in:[ 13 ] } } }, { $project:{ _id:0, start:1, end:1, wynik:{ $zakres:[ "$start", "$koniec", "$krok" ] } } } ])
Wynik:
nieprzechwycony wyjątek:Błąd:polecenie nie powiodło się:{ "ok" :0, "errmsg" :"$range wymaga końcowej wartości numerycznej, znaleziona wartość typu:null", "code" :34445, "codeName" :" Location34445"} :agregacja nie powiodła się :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert .js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js :1058:12@(powłoka)::1:1
Tym razem mówi nam, że $range wymaga końcowej wartości numerycznej, znaleziona wartość typu:null
.