sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB $ rozsah

V MongoDB, $range operátor agregačního kanálu vrací vygenerovanou sekvenci čísel v poli.

Tato posloupnost čísel je založena na vámi zadaných vstupních hodnotách.

Syntaxe

Syntaxe vypadá takto:

{ $range: [ <start>, <end>, <non-zero step> ] }

Kde <start> je začátek a <end> je konec sekvence. Každý z nich může být libovolný platný výraz, který se překládá na celé číslo.

<non-zero step> je volitelný argument, jehož výchozí hodnota je 1. Tento argument umožňuje zadat hodnotu přírůstku. Pokud je zadán, musí to být platný výraz, který se překládá na nenulové celé číslo.

Příklad

Předpokládejme, že máme kolekci nazvanou range s následujícími dokumenty:

{ "_id" : 1, "start" : 0, "end" : 5 }
{ "_id" : 2, "start" : 1, "end" : 5 }

Můžeme použít $range operátor vrátí pole založené na hodnotách v těchto dokumentech.

db.range.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2 ] } } },
     {
       $project:
          {
            _id: 0,
            start: 1,
            end: 1,
            result: { $range: [ "$start", "$end" ] }
          }
     }
   ]
)

Výsledek:

{ "start" : 0, "end" : 5, "result" : [ 0, 1, 2, 3, 4 ] }
{ "start" : 1, "end" : 5, "result" : [ 1, 2, 3, 4 ] }

V tomto případě jsme neposkytli třetí argument, a tedy $range používá svou výchozí hodnotu kroku 1. Prvky pole se proto zvýší o 1.

Přidat explicitní přírůstek

Můžeme přidat třetí argument, který explicitně určí, o kolik se má každý prvek pole zvýšit.

Předpokládejme, že naše sbírka obsahuje následující dokumenty:

{ "_id" : 3, "start" : 0, "end" : 5, "step" : 1 }
{ "_id" : 4, "start" : 0, "end" : 10, "step" : 2 }
{ "_id" : 5, "start" : 1, "end" : 10, "step" : 2 }
{ "_id" : 6, "start" : 100, "end" : 150, "step" : 10 }

Tyto dokumenty mají step pole, a tak můžeme toto pole použít pro zvýšení hodnoty pro příslušný dokument.

Nyní použijeme $range k těmto dokumentům a zahrňte step pole jako třetí argument:

db.range.aggregate(
   [
     { $match: { _id: { $in: [ 3, 4, 5, 6 ] } } },
     {
       $project:
          {
            _id: 0,
            start: 1,
            end: 1,
            step: 1,
            result: { $range: [ "$start", "$end", "$step" ] }
          }
     }
   ]
)

Výsledek:

{ "start" : 0, "end" : 5, "step" : 1, "result" : [ 0, 1, 2, 3, 4 ] }
{ "start" : 0, "end" : 10, "step" : 2, "result" : [ 0, 2, 4, 6, 8 ] }
{ "start" : 1, "end" : 10, "step" : 2, "result" : [ 1, 3, 5, 7, 9 ] }
{ "start" : 100, "end" : 150, "step" : 10, "result" : [ 100, 110, 120, 130, 140 ] }

Hodnoty záporných kroků

Krok může být záporná hodnota, i když to je třeba provést v kontextu dekrementace z vyššího start číslo na nižší end číslo.

Pojďme do naší sbírky přidat několik dalších dokumentů:

{ "_id" : 7, "start" : 0, "end" : 5, "step" : -1 }
{ "_id" : 8, "start" : 5, "end" : 0, "step" : -1 }
{ "_id" : 9, "start" : 0, "end" : -5, "step" : -1 }

Nyní použijeme $range k těm dokumentům:

db.range.aggregate(
   [
     { $match: { _id: { $in: [ 7, 8, 9 ] } } },
     {
       $project:
          {
            _id: 0,
            start: 1,
            end: 1,
            step: 1,
            result: { $range: [ "$start", "$end", "$step" ] }
          }
     }
   ]
)

Výsledek:

{ "start" : 0, "end" : 5, "step" : -1, "result" : [ ] }
{ "start" : 5, "end" : 0, "step" : -1, "result" : [ 5, 4, 3, 2, 1 ] }
{ "start" : 0, "end" : -5, "step" : -1, "result" : [ 0, -1, -2, -3, -4 ] }

Vidíme, že první dokument vrátil prázdné pole, protože záporná hodnota kroku je mimo rozsah, který poskytuje start a end pole.

Následující dokumenty však vytvořily klesající rozsah hodnot.

Když je krok nula

Hodnota kroku musí být nenulové celé číslo. Poskytnutí kroku 0 vrátí chybu.

Předpokládejme, že do naší sbírky přidáme následující dokument:

{ "_id" : 10, "start" : 1, "end" : 5, "step" : 0 }

Zde je to, co se stane, když použijeme $range k tomuto dokumentu:

db.range.aggregate(
   [
     { $match: { _id: { $in: [ 10 ] } } },
     {
       $project:
          {
            _id: 0,
            start: 1,
            end: 1,
            result: { $range: [ "$start", "$end", "$step" ] }
          }
     }
   ]
)

Výsledek:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$range requires a non-zero step value",
	"code" : 34449,
	"codeName" : "Location34449"
} : 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

Chybová zpráva nám výslovně říká, že $range requires a non-zero step value .

Nulové kroky

Krok nemůže být null buď.

Předpokládejme, že máme následující dokument:

{ "_id" : 11, "start" : 1, "end" : 5, "step" : null }

A použijeme $range k tomu:

db.range.aggregate(
   [
     { $match: { _id: { $in: [ 11 ] } } },
     {
       $project:
          {
            _id: 0,
            start: 1,
            end: 1,
            result: { $range: [ "$start", "$end", "$step" ] }
          }
     }
   ]
)

Výsledek:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$range requires a numeric step value, found value of type:null",
	"code" : 34447,
	"codeName" : "Location34447"
} : 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

To nám říká, že $range requires a numeric step value, found value of type:null .

Nulové rozsahy

Pokud start a/nebo end pole jsou null , pak se vrátí chyba.

Předpokládejme, že máme následující dokument:

{ "_id" : 11, "start" : 1, "end" : 5, "step" : null }

A použijte $range k tomu:

db.range.aggregate(
   [
     { $match: { _id: { $in: [ 11 ] } } },
     {
       $project:
          {
            _id: 0,
            start: 1,
            end: 1,
            result: { $range: [ "$start", "$end", "$step" ] }
          }
     }
   ]
)

Výsledek:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$range requires a numeric starting value, found value of type: null",
	"code" : 34443,
	"codeName" : "Location34443"
} : 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

To nám říká, že $range requires a numeric starting value, found value of type: null .

Podobná zpráva by se objevila, pokud by koncová hodnota byla null.

Zde je dokument s null koncová hodnota:

{ "_id" : 13, "start" : 1, "end" : null, "step" : 1 }

Aplikujme $range :

db.range.aggregate(
   [
     { $match: { _id: { $in: [ 13 ] } } },
     {
       $project:
          {
            _id: 0,
            start: 1,
            end: 1,
            result: { $range: [ "$start", "$end", "$step" ] }
          }
     }
   ]
)

Výsledek:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$range requires a numeric ending value, found value of type: null",
	"code" : 34445,
	"codeName" : "Location34445"
} : 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

Tentokrát nám říká, že $range requires a numeric ending value, found value of type: null .


  1. ukládat rozsahy IP v Redis

  2. ServiceStack.Redis:Nelze se připojit:sPort:50071

  3. Použití více databází Mongodb s Meteor.js

  4. Má mongoDB problémy s opětovným připojením nebo to dělám špatně?