MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB-$range

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 .