Trong MongoDB, $log
nhà điều hành đường ống tổng hợp tính toán nhật ký của một số trong cơ sở được chỉ định và trả về kết quả dưới dạng kép.
Cú pháp
Cú pháp như sau:
{ $log: [ <number>, <base> ] }
Ở đâ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. -
<base>
có thể là bất kỳ biểu thức hợp lệ nào phân giải thành một số dương lớn hơn1
.
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 $log
toán tử để trả về cơ sở nhật ký 10 của data
lĩnh vực:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $log: [ "$data", 10 ] }
}
}
]
)
Kết quả:
{ "data" : 0.5, "result" : -0.30102999566398114 } { "data" : 20, "result" : 1.301029995663981 } { "data" : 200, "result" : 2.301029995663981 }
Một cách khác để thực hiện việc này là sử dụng $log10
nhà điều hành.
Tuy nhiên, $log10
chỉ trả về cơ sở nhật ký 10 của một số. Với $log
, mặt khác, chúng tôi có thể chỉ định cơ sở để sử dụng.
Dưới đây là một ví dụ về việc chỉ định cơ số 16:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $log: [ "$data", 16 ] }
}
}
]
)
Kết quả:
{ "data" : 0.5, "result" : -0.25 } { "data" : 20, "result" : 1.0804820237218407 } { "data" : 200, "result" : 1.910964047443681 }
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ể lấy logarit tự nhiên của một số bằng cách sử dụng Math.E
làm đối số thứ hai khi sử dụng $log
.
Ví dụ:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $log: [ "$data", Math.E ] }
}
}
]
)
Kết quả:
{ "data" : 0.5, "result" : -0.6931471805599453 } { "data" : 20, "result" : 2.995732273553991 } { "data" : 200, "result" : 5.298317366548036 }
Hãy nhớ rằng MongoDB cũng có $ln
toán tử, được thiết kế đặc biệt để trả về lôgarit tự nhiên của một số, vì vậy bạn có thể thấy dễ dàng hơn khi sử dụng toán tử đó. Xem MongoDB $ln
để làm ví dụ.
Giá trị ngoài phạm vi
Như đã đề cập, $log
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" : 4, "data" : -20 }
Hãy chạy $log
toán tử đối với tài liệu đó:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $log: [ "$data", 16 ] }
}
}
]
)
Kết quả:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$log's argument must be a positive number, but is -20", "code" : 28758, "codeName" : "Location28758" } : 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" : 5, "data" : "Ten" }
Hãy chạy $log
toán tử đối với tài liệu đó:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $log: [ "$data", 16 ] }
}
}
]
)
Kết quả:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$log's argument must be numeric, not string", "code" : 28756, "codeName" : "Location28756" } : 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 đối số của $log's argument must be numeric, not string
.
Giá trị rỗng
Giá trị rỗng trả về null
khi sử dụng $log
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" : 6, "data" : null }
Hãy chạy $log
toán tử đối với tài liệu đó:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $log: [ "$data", 16 ] }
}
}
]
)
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
, $log
trả về NaN
.
Ví dụ:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $log: [ "$data" * 1, 16 ] }
}
}
]
)
Kết quả:
{ "data" : 0.5, "result" : NaN }
Các trường không tồn tại
Nếu $log
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: { $log: [ "$age", 16 ] }
}
}
]
)
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 $log
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
.