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