sql >> Database >  >> NoSQL >> MongoDB

MongoDB $ bereik

In MongoDB is het $range aggregatiepijplijnoperator retourneert een gegenereerde reeks getallen in een array.

Deze reeks getallen is gebaseerd op de invoerwaarden die u opgeeft.

Syntaxis

De syntaxis gaat als volgt:

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

Waar <start> is het begin en <end> is het einde van de reeks. Elk van deze kan elke geldige uitdrukking zijn die wordt omgezet in een geheel getal.

<non-zero step> is een optioneel argument dat standaard is ingesteld op 1. Met dit argument kunt u een verhogingswaarde opgeven. Indien opgegeven, moet het een geldige expressie zijn die wordt omgezet in een geheel getal dat niet nul is.

Voorbeeld

Stel dat we een verzameling hebben met de naam range met de volgende documenten:

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

We kunnen de $range . gebruiken operator om een ​​array te retourneren op basis van de waarden in die documenten.

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

Resultaat:

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

In dit geval hebben we geen derde argument gegeven, en dus $range gebruikt de standaard stapwaarde van 1. Daarom worden de array-elementen met 1 verhoogd.

Een expliciete verhoging toevoegen

We kunnen een derde argument toevoegen om expliciet te specificeren met hoeveel elk array-element moet worden verhoogd.

Stel dat onze collectie de volgende documenten bevat:

{ "_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 }

Deze documenten hebben een step veld, en dus kunnen we dat veld gebruiken voor de oplopende waarde voor het respectieve document.

Laten we nu $range toepassen naar die documenten, en voeg de step veld als derde 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" ] }
          }
     }
   ]
)

Resultaat:

{ "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 ] }

Negatieve stapwaarden

De stap kan een negatieve waarde zijn, hoewel dit moet worden gedaan in de context van het verlagen van een hogere start nummer naar een lager end nummer.

Laten we nog een paar documenten aan onze collectie toevoegen:

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

Laten we nu $range toepassen naar die documenten:

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

Resultaat:

{ "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 ] }

We kunnen zien dat het eerste document een lege array retourneerde omdat de negatieve stapwaarde buiten het bereik ligt dat wordt geboden door de start en end velden.

De daaropvolgende documenten produceerden echter een afnemend bereik van waarden.

Als de stap nul is

De stapwaarde moet een geheel getal zijn dat niet nul is. Het verstrekken van een stap van 0 geeft een fout terug.

Stel dat we het volgende document aan onze collectie toevoegen:

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

Dit is wat er gebeurt als we $range toepassen naar dat document:

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

Resultaat:

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

De foutmelding vertelt ons expliciet dat $range requires a non-zero step value .

Null-stappen

De stap mag niet null zijn ofwel.

Stel dat we het volgende document hebben:

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

En we passen $range toe ernaar toe:

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

Resultaat:

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

Dit vertelt ons dat $range requires a numeric step value, found value of type:null .

Null-bereiken

Als de start en/of end velden zijn null , dan wordt er een fout geretourneerd.

Stel dat we het volgende document hebben:

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

En pas $range toe ernaar toe:

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

Resultaat:

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

Dit vertelt ons dat $range requires a numeric starting value, found value of type: null .

Een soortgelijk bericht zou verschijnen als de eindwaarde null was.

Hier is een document met een null eindwaarde:

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

Laten we $range toepassen :

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

Resultaat:

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

Deze keer vertelt het ons dat $range requires a numeric ending value, found value of type: null .


  1. Memcached installeren op Debian 9

  2. Is dit een geldig gebruik van ServiceStack Redis?

  3. het MongoDB-cachesysteem begrijpen

  4. Redis-replicatie gebruiken op verschillende machines (multimaster)