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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
DBCoexample@sqldat.com/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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 .