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 :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 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 :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
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 .