I MongoDB er $range
aggregeringspipeline-operatør returnerer en genereret sekvens af tal i en matrix.
Denne talsekvens er baseret på de inputværdier, du angiver.
Syntaks
Syntaksen ser sådan ud:
{ $range:[ , , ] }
Hvor
er slutningen af sekvensen. Hver af disse kan være et hvilket som helst gyldigt udtryk, der opløses til et heltal.
Eksempel
Antag, at vi har en samling kaldet range
med følgende dokumenter:
{ "_id" :1, "start" :0, "end" :5 }{ "_id" :2, "start" :1, "end" :5 }
Vi kan bruge $range
operatør for at returnere et array baseret på værdierne i disse dokumenter.
db.range.aggregate( [ { $match:{ _id:{ $in:[ 1, 2 ] } } }, { $project:{ _id:0, start:1, end:1, resultat:{ $range:[ "$start", "$end" ] } } } ])
Resultat:
{ "start" :0, "end" :5, "result" :[ 0, 1, 2, 3, 4 ] }{ "start" :1, "end" :5, "result" :[ 1, 2, 3, 4 ] }
I dette tilfælde gav vi ikke et tredje argument, og derfor $range
bruger sin standardtrinværdi på 1. Derfor stiger array-elementerne med 1.
Tilføj en eksplicit stigning
Vi kan tilføje et tredje argument for eksplicit at angive, hvor meget hvert array-element skal stige med.
Antag, at vores samling indeholder følgende dokumenter:
{ "_id" :3, "start" :0, "end" :5, "step" :1 }{ "_id" :4, "start" :0, "end" :10, "step" :2 }{ "_id" :5, "start" :1, "slut" :10, "trin" :2 }{ "_id" :6, "start" :100, "slut" :150, "trin" :10 }
Disse dokumenter har et trin
felt, og så kan vi bruge det felt til den stigende værdi for det respektive dokument.
Lad os nu anvende $range
til disse dokumenter, og inkluder trinnet
felt som et tredje argument:
db.range.aggregate( [ { $match:{ _id:{ $in:[ 3, 4, 5, 6 ] } } }, { $project:{ _id:0, start:1, slut:1, trin:1, resultat:{ $range:[ "$start", "$end", "$step" ] } } } ])
Resultat:
{ "start" :0, "slut" :5, "trin" :1, "resultat" :[ 0, 1, 2, 3, 4 ] }{ "start" :0, "slut" :10 , "trin" :2, "resultat" :[ 0, 2, 4, 6, 8 ] }{ "start" :1, "slut" :10, "trin" :2, "resultat" :[ 1, 3 , 5, 7, 9 ] }{ "start" :100, "slut" :150, "trin" :10, "resultat" :[ 100, 110, 120, 130, 140 ] }
Negative trinværdier
Trinet kan være en negativ værdi, selvom dette skal gøres i forbindelse med nedsættelse fra en højere start
nummer til en lavere ende
nummer.
Lad os tilføje et par flere dokumenter til vores samling:
{ "_id" :7, "start" :0, "end" :5, "step" :-1 }{ "_id" :8, "start" :5, "end" :0, "trin " :-1 }{ "_id" :9, "start" :0, "end" :-5, "trin" :-1 }
Lad os nu anvende $range
til disse dokumenter:
db.range.aggregate( [ { $match:{ _id:{ $in:[ 7, 8, 9 ] } } }, { $project:{ _id:0, start:1, end:1, trin:1, resultat:{ $range:[ "$start", "$end", "$step" ] } } } ])
Resultat:
{ "start" :0, "end" :5, "trin" :-1, "resultat" :[ ] }{ "start" :5, "slut" :0, "trin" :-1, "resultat" :[ 5, 4, 3, 2, 1 ] }{ "start" :0, "slut" :-5, "trin" :-1, "resultat" :[ 0, -1, -2, -3, -4 ] }
Vi kan se, at det første dokument returnerede et tomt array, fordi den negative trinværdi er uden for det interval, der er angivet af start
og end
felter.
Imidlertid producerede de efterfølgende dokumenter et faldende værdiområde.
Når trinnet er nul
Trinværdien skal være et heltal, der ikke er nul. Angivelse af et trin på 0
returnerer en fejl.
Antag, at vi tilføjer følgende dokument til vores samling:
{ "_id" :10, "start" :1, "end" :5, "trin" :0 }
Her er, hvad der sker, når vi anvender $range
til det dokument:
db.range.aggregate( [ { $match:{ _id:{ $in:[ 10 ] } } }, { $project:{ _id:0, start:1, end:1, result:{ $range:[ "$start", "$end", "$step" ] } } } ])
Resultat:
ufanget undtagelse:Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"$range kræver en trinværdi, der ikke er nul", "code" :34449, "codeName" :"Location34449"} :aggregeret mislykkedes :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12@ (skal):1:1
Fejlmeddelelsen fortæller os eksplicit, at $range kræver en trinværdi, der ikke er nul
.
Nul trin
Trinet kan ikke være null
enten.
Antag, at vi har følgende dokument:
{ "_id" :11, "start" :1, "end" :5, "trin" :null }
Og vi anvender $range
til det:
db.range.aggregate( [ { $match:{ _id:{ $in:[ 11 ] } } }, { $project:{ _id:0, start:1, end:1, result:{ $range:[ "$start", "$end", "$step" ] } } } ])
Resultat:
ufanget undtagelse:Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"$range kræver en numerisk trinværdi, fundet værdi af type:null", "code" :34447, "codeName" :" Location34447"} :aggregat mislykkedes :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert .js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js :1058:12@(shell):1:1
Dette fortæller os, at $range kræver en numerisk trinværdi, fundet værdi af type:null
.
Nul-intervaller
Hvis start
og/eller end
felter er null
, så returneres en fejl.
Antag, at vi har følgende dokument:
{ "_id" :11, "start" :1, "end" :5, "trin" :null }
Og anvend $range
til det:
db.range.aggregate( [ { $match:{ _id:{ $in:[ 11 ] } } }, { $project:{ _id:0, start:1, end:1, result:{ $range:[ "$start", "$end", "$step" ] } } } ])
Resultat:
ufanget undtagelse:Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"$range kræver en numerisk startværdi, fundet værdi af typen:null", "code" :34443, "codeName" :" Location34443"} :aggregat mislykkedes :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert .js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js :1058:12@(shell):1:1
Dette fortæller os, at $range kræver en numerisk startværdi, fundet værdi af typen:null
.
En lignende meddelelse ville blive vist, hvis slutværdien var nul.
Her er et dokument med en null
slutværdi:
{ "_id" :13, "start" :1, "end" :null, "trin" :1 }
Lad os anvende $range
:
db.range.aggregate( [ { $match:{ _id:{ $in:[ 13 ] } } }, { $project:{ _id:0, start:1, end:1, result:{ $range:[ "$start", "$end", "$step" ] } } } ])
Resultat:
ufanget undtagelse:Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"$range kræver en numerisk slutværdi, fundet værdi af typen:null", "code" :34445, "codeName" :" Location34445"} :aggregat mislykkedes :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert .js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js :1058:12@(shell):1:1
Denne gang fortæller det os, at $range kræver en numerisk slutværdi, fundet værdi af typen:null
.