Trong MongoDB, $ln
toán tử đường ống tổng hợp tính toán lôgarit tự nhiên (ln
) của một số và trả về kết quả là một số kép.
Cú pháp
Cú pháp như sau:
{ $ln: <number> }
Ở đâu <number>
có thể là bất kỳ biểu thức hợp lệ nào phân giải thành một số không âm.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là test
với tài liệu sau:
{ "_id" : 1, "data" : 0.5 } { "_id" : 2, "data" : 20 } { "_id" : 3, "data" : 200 }
Chúng ta có thể sử dụng $ln
toán tử để trả về lôgarit tự nhiên của data
lĩnh vực:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $ln: [ "$data" ] }
}
}
]
)
Kết quả:
{ "data" : 0.5, "result" : -0.6931471805599453 } { "data" : 20, "result" : 2.995732273553991 } { "data" : 200, "result" : 5.298317366548036 }
Một cách khác để thực hiện việc này là sử dụng $log
toán tử với đối số thứ hai của Math.E
. Xem MongoDB $log
để làm ví dụ.
Lôgarit tự nhiên
Lôgarit tự nhiên của một số là lôgarit của nó với cơ số của hằng số toán học e , ở đâu đ là một số vô tỷ và siêu việt bắt đầu bằng 2.7182818284590452353602874713527 và tiếp tục mãi mãi.
Hằng số toán học e còn được gọi là số của Euler.
Trong JavaScript, chúng ta có thể sử dụng Math.E
đại diện cho e . Do đó, chúng ta có thể nhận được lôgarit tự nhiên của e bằng cách sử dụng Math.E
làm đối số khi sử dụng $ln
.
Giả sử chúng ta có một tài liệu như sau:
{ "_id" : 4, "data" : 2.718281828459045 }
Trường dữ liệu chứa e
đến 15 chữ số thập phân.
Ví dụ này sử dụng hai cách để trả về lôgarit tự nhiên của e :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
_id: 0,
e_1: { $ln: [ "$data" ] },
e_2: { $ln: [ Math.E ] }
}
}
]
)
Kết quả:
{ "e_1" : 1, "e_2" : 1 }
Kết quả đầu tiên sử dụng dữ liệu từ tài liệu. Đối với kết quả thứ hai, chúng tôi sử dụng Math.E
để tạo e
.
Dù bằng cách nào, kết quả là 1
.
Giá trị ngoài phạm vi
Như đã đề cập, $ln
toán tử chấp nhận bất kỳ biểu thức hợp lệ nào phân giải thành một số không âm. Các giá trị nằm ngoài phạm vi đó sẽ gây ra lỗi.
Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập của mình:
{ "_id" : 5, "data" : -20 }
Hãy chạy $ln
toán tử đối với tài liệu đó:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $ln: [ "$data" ] }
}
}
]
)
Kết quả:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$ln's argument must be a positive number, but is -20", "code" : 28766, "codeName" : "Location28766" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1
Loại dữ liệu sai
Cung cấp loại dữ liệu sai cũng sẽ gây ra lỗi.
Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập của mình:
{ "_id" : 6, "data" : "Ten" }
Hãy chạy $ln
toán tử đối với tài liệu đó:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $ln: [ "$data" ] }
}
}
]
)
Kết quả:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$ln only supports numeric types, not string", "code" : 28765, "codeName" : "Location28765" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1
Chúng tôi đã cung cấp một chuỗi và do đó, thông báo lỗi cho chúng tôi biết rằng $ln only supports numeric types, not string
.
Giá trị rỗng
Giá trị rỗng trả về null
khi sử dụng $ln
nhà điều hành.
Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập của mình:
{ "_id" : 7, "data" : null }
Hãy chạy $ln
toán tử đối với tài liệu đó:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $ln: [ "$data" ] }
}
}
]
)
Kết quả:
{ "data" : null, "result" : null }
Chúng ta có thể thấy rằng kết quả là null
.
Giá trị NaN
Nếu đối số phân giải thành NaN
, $ln
trả về NaN
.
Ví dụ:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $ln: [ "$data" * 1 ] }
}
}
]
)
Kết quả:
{ "data" : 0.5, "result" : NaN }
Các trường không tồn tại
Nếu $ln
toán tử được áp dụng cho một trường không tồn tại, null
được trả lại.
Ví dụ:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $ln: [ "$age" ] }
}
}
]
)
Kết quả:
{ "data" : 0.5, "result" : null }
Trong trường hợp này, chúng tôi đã cố gắng áp dụng $ln
chống lại một trường có tên là age
, nhưng trường đó không tồn tại trong tài liệu và vì vậy chúng tôi nhận được null
.