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

MongoDB $log

I MongoDB er $log aggregeringspipeline-operatør beregner loggen for et tal i den angivne base og returnerer resultatet som en fordobling.

Syntaks

Syntaksen ser sådan ud:

{ $log:[ , ] }

Hvor:

  • kan være et hvilket som helst gyldigt udtryk, der løses til et ikke-negativt tal.
  • kan være et hvilket som helst gyldigt udtryk, der løses til et positivt tal større end 1 .

Eksempel

Antag, at vi har en samling kaldet test med følgende dokument:

{ "_id" :1, "data" :0,5 }{ "_id" :2, "data" :20 }{ "_id" :3, "data" :200 }

Vi kan bruge $log operatør for at returnere logbasen 10 af data felt:

db.test.aggregate( [ { $match:{ _id:{ $in:[ 1, 2, 3 ] } } }, { $project:{ _id:0, data:1, result:{ $log:[ "$data", 10 ] } } } ]) 

Resultat:

{ "data" :0.5, "result" :-0.30102999566398114 }{ "data" :20, "result" :1.301029995663981 }{ "data" :200, "result" :29309 :29399. 

En anden måde at gøre dette på ville have været at bruge $log10 operatør.

Dog $log10 returnerer kun logbasen 10 af et tal. Med $log , på den anden side kan vi angive den base, der skal bruges.

Her er et eksempel på at angive en base på 16:

db.test.aggregate( [ { $match:{ _id:{ $in:[ 1, 2, 3 ] } } }, { $project:{ _id:0, data:1, result:{ $log:[ "$data", 16 ] } } } ]) 

Resultat:

{ "data" :0,5, "result" :-0,25 }{ "data" :20, "result" :1,0804820237218407 }{ "data" :200, "result" :1,910964047443681 

Naturlig logaritme

Et tals naturlige logaritme er dets logaritme til bunden af ​​den matematiske konstant e , hvor e er et irrationelt og transcendentalt tal, der starter med 2,7182818284590452353602874713527 og fortsætter for evigt.

Den matematiske konstant e er også kendt som Eulers nummer.

I JavaScript kan vi bruge Math.E at repræsentere e . Vi kan derfor få den naturlige logaritme af et tal ved at bruge Math.E som det andet argument ved brug af $log .

Eksempel:

db.test.aggregate( [ { $match:{ _id:{ $in:[ 1, 2, 3 ] } } }, { $project:{ _id:0, data:1, result:{ $log:[ "$data", Math.E ] } } } ]) 

Resultat:

{ "data" :0.5, "result" :-0.6931471805599453 }{ "data" :20, "result" :2.995732273553991 }{ "data" :200, "result" :31736685} 

Husk, at MongoDB også har $ln operator, som er specielt designet til at returnere den naturlige logaritme af et tal, så du kan finde det nemmere at bruge denne operator i stedet for. Se MongoDB $ln for et eksempel.

Værdier uden for område

Som nævnt er $log operatoren accepterer ethvert gyldigt udtryk, der løses til et ikke-negativt tal. Værdier uden for dette område vil forårsage en fejl.

Antag, at vi tilføjer følgende dokument til vores samling:

{ "_id" :4, "data" :-20 }

Lad os køre $log operatør mod dette dokument:

db.test.aggregate( [ { $match:{ _id:{ $in:[ 4 ] } } }, { $project:{ _id:0, data:1, result:{ $log:[ "$data", 16 ] } } } ]) 

Resultat:

ufanget undtagelse:Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"$logs argument skal være et positivt tal, men er -20", "code" :28758, "codeName" :"Location28758 "} :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

Forkert datatype

Angivelse af den forkerte datatype vil også forårsage en fejl.

Antag, at vi tilføjer følgende dokument til vores samling:

{ "_id" :5, "data" :"Ti" }

Lad os køre $log operatør mod dette dokument:

db.test.aggregate( [ { $match:{ _id:{ $in:[ 5 ] } } }, { $project:{ _id:0, data:1, result:{ $log:[ "$data", 16 ] } } } ]) 

Resultat:

ufanget undtagelse:Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"$logs argument skal være numerisk, ikke streng", "code" :28756, "codeName" :"Location28756"}: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

Vi har angivet en streng, så fejlmeddelelsen fortæller os, at $logs argument skal være numerisk, ikke streng .

Nul-værdier

Nul-værdier returnerer null når du bruger $log operatør.

Antag, at vi tilføjer følgende dokument til vores samling:

{ "_id" :6, "data" :null }

Lad os køre $log operatør mod dette dokument:

db.test.aggregate( [ { $match:{ _id:{ $in:[ 6 ] } } }, { $project:{ _id:0, data:1, result:{ $log:[ "$data", 16 ] } } } ]) 

Resultat:

{ "data" :null, "result" :null }

Vi kan se, at resultatet er null .

NaN-værdier

Hvis argumentet løses til NaN$log returnerer NaN .

Eksempel:

db.test.aggregate( [ { $match:{ _id:{ $in:[ 1 ] } } }, { $project:{ _id:0, data:1, result:{ $log:[ "$data" * 1, 16 ] } } } ]) 

Resultat:

{ "data" :0,5, "result" :NaN }

Ikke-eksisterende felter

Hvis $log operator anvendes mod et felt, der ikke eksisterer, null er returneret.

Eksempel:

db.test.aggregate( [ { $match:{ _id:{ $in:[ 1 ] } } }, { $project:{ _id:0, data:1, result:{ $log:[ "$age", 16 ] } } } ]) 

Resultat:

{ "data" :0.5, "result" :null }

I dette tilfælde forsøgte vi at anvende $log mod et felt kaldet age , men det felt findes ikke i dokumentet, og derfor får vi null .


  1. Sådan gør du:Indekser scannede PDF'er i skala ved hjælp af færre end 50 kodelinjer

  2. hvordan håndterer man session expire ved at basere redis?

  3. MongoDB $strLenBytes

  4. Skip/Mock Redis In Junit