sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB $rækkevidde

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 starten og er slutningen af ​​sekvensen. Hver af disse kan være et hvilket som helst gyldigt udtryk, der opløses til et heltal.

er et valgfrit argument, der som standard er 1. Dette argument giver dig mulighed for at angive en stigningsværdi. Hvis det er angivet, skal det være et gyldigt udtryk, der løses til et heltal, der ikke er nul.

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 .


  1. Opretter du forbindelse til mongodb gennem browseren?

  2. MongoDB forespørger om flere samlinger på én gang

  3. Mongo Find()-funktionen vil ikke udelukke _id

  4. I NodeJS, hvordan udlæses resultater fra mongodb med forskellige feltnavne?