MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB $zakres

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 to początek i jest końcem sekwencji. Każdy z nich może być dowolnym prawidłowym wyrażeniem, które rozwiązuje się na liczbę całkowitą.

jest opcjonalnym argumentem, którego domyślną wartością jest 1. Ten argument umożliwia określenie wartości przyrostu. Jeśli zostanie podany, musi być prawidłowym wyrażeniem, które prowadzi do niezerowej liczby całkowitej.

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:

nieprzechwycony wyjątek:Błąd:polecenie nie powiodło się:{ "ok" :0, "errmsg" :"$range wymaga niezerowej wartości kroku", "code" :34449, "codeName" :"Location34449"} :agregat nie powiodło 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

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 .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak dołączyć do wielu kolekcji za pomocą $lookup w mongodb

  2. Porównanie agregacji MongoDB:group(), $group i MapReduce

  3. Muszę pobrać obiekt MongoDB tylko za pomocą filtrowanego elementu tablicy

  4. Jak mogę przechowywać porę dnia w MongoDB? Jako ciąg? Podaj dowolny rok/miesiąc/dzień?

  5. Aktualizacja ścieżki „x” spowodowałaby konflikt w miejscu „x”