In MongoDB der $range
Der Aggregations-Pipeline-Operator gibt eine generierte Folge von Zahlen in einem Array zurück.
Diese Zahlenfolge basiert auf den von Ihnen angegebenen Eingabewerten.
Syntax
Die Syntax lautet wie folgt:
{ $range: [ <start>, <end>, <non-zero step> ] }
Wobei <start>
ist der Anfang und <end>
ist das Ende der Sequenz. Jeder davon kann ein beliebiger gültiger Ausdruck sein, der in eine Ganzzahl aufgelöst wird.
<non-zero step>
ist ein optionales Argument, das standardmäßig 1 ist. Mit diesem Argument können Sie einen Inkrementwert angeben. Falls angegeben, muss es sich um einen gültigen Ausdruck handeln, der in eine ganze Zahl ungleich Null aufgelöst wird.
Beispiel
Angenommen, wir haben eine Sammlung namens range
mit folgenden Dokumenten:
{ "_id" : 1, "start" : 0, "end" : 5 } { "_id" : 2, "start" : 1, "end" : 5 }
Wir können den $range
verwenden -Operator, um ein Array basierend auf den Werten in diesen Dokumenten zurückzugeben.
db.range.aggregate(
[
{ $match: { _id: { $in: [ 1, 2 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
result: { $range: [ "$start", "$end" ] }
}
}
]
)
Ergebnis:
{ "start" : 0, "end" : 5, "result" : [ 0, 1, 2, 3, 4 ] } { "start" : 1, "end" : 5, "result" : [ 1, 2, 3, 4 ] }
In diesem Fall haben wir kein drittes Argument angegeben, also $range
verwendet seinen Standardschrittwert von 1. Daher werden die Array-Elemente um 1 erhöht.
Fügen Sie ein explizites Inkrement hinzu
Wir können ein drittes Argument hinzufügen, um explizit anzugeben, um wie viel jedes Array-Element inkrementiert werden soll.
Angenommen, unsere Sammlung enthält die folgenden Dokumente:
{ "_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 }
Diese Dokumente haben einen step
Feld, und so können wir dieses Feld für den inkrementierenden Wert für das jeweilige Dokument verwenden.
Wenden wir nun $range
an zu diesen Dokumenten hinzufügen und den step
einfügen Feld als drittes 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" ] }
}
}
]
)
Ergebnis:
{ "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 ] }
Negative Schrittwerte
Der Schritt kann ein negativer Wert sein, obwohl dies im Kontext des Dekrementierens von einem höheren start
erfolgen muss Nummer zu einem unteren end
Anzahl.
Fügen wir unserer Sammlung ein paar weitere Dokumente hinzu:
{ "_id" : 7, "start" : 0, "end" : 5, "step" : -1 } { "_id" : 8, "start" : 5, "end" : 0, "step" : -1 } { "_id" : 9, "start" : 0, "end" : -5, "step" : -1 }
Wenden wir nun $range
an zu diesen Dokumenten:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 7, 8, 9 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
step: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Ergebnis:
{ "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 ] }
Wir können sehen, dass das erste Dokument ein leeres Array zurückgegeben hat, da der negative Schrittwert außerhalb des von start
bereitgestellten Bereichs liegt und end
Felder.
Die nachfolgenden Dokumente erzeugten jedoch einen dekrementierenden Wertebereich.
Wenn der Schritt Null ist
Der Schrittwert muss eine ganze Zahl ungleich Null sein. Bereitstellen eines Schritts von 0
gibt einen Fehler zurück.
Angenommen, wir fügen unserer Sammlung das folgende Dokument hinzu:
{ "_id" : 10, "start" : 1, "end" : 5, "step" : 0 }
Folgendes passiert, wenn wir $range
anwenden zu diesem Dokument:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 10 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Ergebnis:
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
Die Fehlermeldung teilt uns ausdrücklich mit, dass $range requires a non-zero step value
.
Nullschritte
Der Schritt darf nicht null
sein entweder.
Angenommen, wir haben das folgende Dokument:
{ "_id" : 11, "start" : 1, "end" : 5, "step" : null }
Und wir wenden $range
an dazu:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 11 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Ergebnis:
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
Dies sagt uns, dass $range requires a numeric step value, found value of type:null
.
Nullbereiche
Wenn der start
und/oder end
Felder sind null
, dann wird ein Fehler zurückgegeben.
Angenommen, wir haben das folgende Dokument:
{ "_id" : 11, "start" : 1, "end" : 5, "step" : null }
Und wenden Sie $range
an dazu:
db.range.aggregate(
[
{ $match: { _id: { $in: [ 11 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Ergebnis:
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
Dies sagt uns, dass $range requires a numeric starting value, found value of type: null
.
Eine ähnliche Meldung würde erscheinen, wenn der Endwert null wäre.
Hier ist ein Dokument mit einem null
Endwert:
{ "_id" : 13, "start" : 1, "end" : null, "step" : 1 }
Wenden wir $range
an :
db.range.aggregate(
[
{ $match: { _id: { $in: [ 13 ] } } },
{
$project:
{
_id: 0,
start: 1,
end: 1,
result: { $range: [ "$start", "$end", "$step" ] }
}
}
]
)
Ergebnis:
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
Dieses Mal sagt es uns, dass $range requires a numeric ending value, found value of type: null
.