sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $log

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

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


  1. Lägg till en sträng i slutet av ett befintligt fält i MongoDB

  2. Automatisk ökningssekvens i mongodb med java

  3. Relationellt DB i minnet?

  4. MongoDB-CR-autentisering misslyckades