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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 .