I MongoDB, $log
aggregeringspipeline-operatören beräknar loggen för ett tal i den angivna basen och returnerar resultatet som en dubbel.
Syntax
Syntaxen ser ut så här:
{ $log:[ , ] }
Var:
kan vara vilket giltigt uttryck som helst som löser sig till ett icke-negativt tal. kan vara vilket giltigt uttryck som helst som löser sig till ett positivt tal större än 1
.
Exempel
Anta att vi har en samling som heter test
med följande dokument:
{ "_id" :1, "data" :0,5 }{ "_id" :2, "data" :20 }{ "_id" :3, "data" :200 }
Vi kan använda $log
operatör för att returnera loggbasen 10 av data
fält:
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 :2939.Ett annat sätt att göra detta skulle ha varit att använda
$log10
operatör.Men
$log10
returnerar endast loggbasen 10 för ett tal. Med$log
, å andra sidan kan vi ange vilken bas som ska användas.Här är ett exempel på hur du anger en bas 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 logaritm
Den naturliga logaritmen för ett tal är dess logaritm till basen av den matematiska konstanten e , där e är ett irrationellt och transcendentalt tal som börjar med 2,7182818284590452353602874713527 och fortsätter för evigt.
Den matematiska konstanten e är också känt som Eulers nummer.
I JavaScript kan vi använda
Math.E
att representera e . Vi kan därför få den naturliga logaritmen för ett tal genom att användaMath.E
som det andra argumentet när du använder$log
.Exempel:
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}> 5,369Tänk på att MongoDB också har
$ln
operator, som är speciellt utformad för att returnera den naturliga logaritmen för ett tal, så att du kanske tycker det är lättare att använda den operatorn istället. Se MongoDB$ln
till exempel.Värden utanför intervallet
Som nämnts,
$log
operatorn accepterar alla giltiga uttryck som löser sig till ett icke-negativt tal. Värden utanför det intervallet kommer att orsaka ett fel.Anta att vi lägger till följande dokument i vår samling:
{ "_id" :4, "data" :-20 }Låt oss köra
$log
operatör mot det dokumentet:db.test.aggregate( [ { $match:{ _id:{ $in:[ 4 ] } } }, { $project:{ _id:0, data:1, result:{ $log:[ "$data", 16 ] } } } ])
Resultat:
oupptäckt undantag:Fel:kommando misslyckades:{ "ok" :0, "errmsg" :"$logs argument måste vara ett positivt tal, men är -20", "code" :28758, "codeName" :"Location28758 "} :aggregat misslyckades :[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:1Fel datatyp
Att ange fel datatyp kommer också att orsaka ett fel.
Anta att vi lägger till följande dokument i vår samling:
{ "_id" :5, "data" :"Tio" }Låt oss köra
$log
operatör mot det dokumentet:db.test.aggregate( [ { $match:{ _id:{ $in:[ 5 ] } } }, { $project:{ _id:0, data:1, result:{ $log:[ "$data", 16 ] } } } ])
Resultat:
oupptäckt undantag:Fel:kommando misslyckades:{ "ok" :0, "errmsg" :"$logs argument måste vara numeriskt, inte sträng", "code" :28756, "codeName" :"Location28756"} :aggregerat misslyckades :[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 angav en sträng, så felmeddelandet talar om för oss att
$logs argument måste vara numeriskt, inte sträng
.Nullvärden
Nullvärden returnerar
null
när du använder$log
operatör.Anta att vi lägger till följande dokument i vår samling:
{ "_id" :6, "data" :null }Låt oss köra
$log
operatör mot det dokumentet:db.test.aggregate( [ { $match:{ _id:{ $in:[ 6 ] } } }, { $project:{ _id:0, data:1, result:{ $log:[ "$data", 16 ] } } } ])
Resultat:
{ "data" :null, "result" :null }Vi kan se att resultatet är
null
.NaN-värden
Om argumentet löser sig till
NaN
,$log
returnerarNaN
.Exempel:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 1 ] } } }, { $project:{ _id:0, data:1, result:{ $log:[ "$data" * 1, 16 ] } } } ])
Resultat:
{ "data" :0,5, "result" :NaN }Icke-existerande fält
Om
$log
operatorn tillämpas mot ett fält som inte finns,null
returneras.Exempel:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 1 ] } } }, { $project:{ _id:0, data:1, result:{ $log:[ "$age", 16 ] } } } ])
Resultat:
{ "data" :0.5, "result" :null }I det här fallet försökte vi använda
$log
mot ett fält som heterålder
, men det fältet finns inte i dokumentet, så vi fårnull
.