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
.