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
.