V MongoDB, $ln
Operátor agregačního potrubí vypočítá přirozený logaritmus (ln
) čísla a vrátí výsledek jako dvojnásobek.
Syntaxe
Syntaxe vypadá takto:
{ $ln: <number> }
Kde <number>
může být jakýkoli platný výraz, který se převede na nezáporné číslo.
Příklad
Předpokládejme, že máme kolekci nazvanou test
s následujícím dokumentem:
{ "_id" :1, "data" :0,5 }{ "_id" :2, "data" :20 }{ "_id" :3, "data" :200 }
Můžeme použít $ln
operátor vrátí přirozený logaritmus data
pole:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $ln: [ "$data" ] }
}
}
]
)
Výsledek:
{ "data" :0,5, "výsledek" :-0,6931471805599453 }{ "data" :20, "výsledek" :2,995732273553991 }{ "data" :200, "výsledek" :3 645>3608Jiný způsob, jak to udělat, by bylo použít
$log
operátor s druhým argumentemMath.E
. Viz MongoDB$log
pro příklad.Přirozený logaritmus
Přirozený logaritmus čísla je jeho logaritmus k základně matematické konstanty e , kde e je iracionální a transcendentální číslo, které začíná 2,7182818284590452353602874713527 a pokračuje navždy.
Matematická konstanta e je také známé jako Eulerovo číslo.
V JavaScriptu můžeme použít
Math.E
reprezentovat e . Můžeme tedy získat přirozený logaritmus e pomocíMath.E
jako argument při použití$ln
.Předpokládejme, že máme dokument jako tento:
{ "_id" :4, "data" :2,718281828459045 }Datové pole obsahuje
e
na 15 desetinných míst.Tento příklad používá dva způsoby, jak vrátit přirozený logaritmus e :
db.test.aggregate( [ { $match: { _id: { $in: [ 4 ] } } }, { $project: { _id: 0, e_1: { $ln: [ "$data" ] }, e_2: { $ln: [ Math.E ] } } } ] )
Výsledek:
{ "e_1" :1, "e_2" :1 }První výsledek využívá data z dokumentu. Pro druhý výsledek použijeme
Math.E
vygenerovate
.V obou případech je výsledkem
1
.Hodnoty mimo rozsah
Jak již bylo zmíněno,
$ln
operátor přijímá jakýkoli platný výraz, který se překládá na nezáporné číslo. Hodnoty mimo tento rozsah způsobí chybu.Předpokládejme, že do naší sbírky přidáme následující dokument:
{ "_id" :5, "data" :-20 }Spusťte
$ln
operátor proti tomuto dokumentu:db.test.aggregate( [ { $match: { _id: { $in: [ 5 ] } } }, { $project: { _id: 0, data: 1, result: { $ln: [ "$data" ] } } } ] )
Výsledek:
nezachycená výjimka:Chyba:příkaz se nezdařil:{ "ok" :0, "errmsg" :"Argument $ln musí být kladné číslo, ale je -20", "code" :28766, "codeName" :"Umístění28766 "} :agregace selhala :[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:1Nesprávný datový typ
Chybu také způsobí zadání nesprávného typu dat.
Předpokládejme, že do naší sbírky přidáme následující dokument:
{ "_id" :6, "data" :"Ten" }Spusťte
$ln
operátor proti tomuto dokumentu:db.test.aggregate( [ { $match: { _id: { $in: [ 6 ] } } }, { $project: { _id: 0, data: 1, result: { $ln: [ "$data" ] } } } ] )
Výsledek:
nezachycená výjimka:Chyba:příkaz se nezdařil:{ "ok" :0, "errmsg" :"$ln podporuje pouze číselné typy, nikoli řetězec", "code" :28765, "codeName" :"Location28765"} :agregace selhalo :[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:1Poskytli jsme řetězec, a tak nám chybová zpráva říká, že
$ln only supports numeric types, not string
.Nulové hodnoty
Hodnoty Null vrátí
null
při použití$ln
operátor.Předpokládejme, že do naší sbírky přidáme následující dokument:
{ "_id" :7, "data" :null }Spusťte
$ln
operátor proti tomuto dokumentu:db.test.aggregate( [ { $match: { _id: { $in: [ 7 ] } } }, { $project: { _id: 0, data: 1, result: { $ln: [ "$data" ] } } } ] )
Výsledek:
{ "data" :null, "result" :null }Vidíme, že výsledek je
null
.Hodnoty NaN
Pokud je argument vyřešen na
NaN
,$ln
vrátíNaN
.Příklad:
db.test.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { _id: 0, data: 1, result: { $ln: [ "$data" * 1 ] } } } ] )
Výsledek:
{ "data" :0,5, "výsledek" :NaN }Neexistující pole
Pokud
$ln
operátor se použije na pole, které neexistuje,null
je vráceno.Příklad:
db.test.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { _id: 0, data: 1, result: { $ln: [ "$age" ] } } } ] )
Výsledek:
{ "data" :0,5, "result" :null }V tomto případě jsme zkusili použít
$ln
proti poli s názvemage
, ale toto pole v dokumentu neexistuje, a tak dostanemenull
.