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,910964047443681 Naturlig 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ända Math.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,369
Tä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 :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 Fel 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 :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 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 returnerar NaN .
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år null .