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,910964047443681Naturlig 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 brugeMath.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:1Forkert 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:1Vi 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
returnererNaN
.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 kaldetage
, men det felt findes ikke i dokumentet, og derfor får vinull
.