MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB $ log

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ơn 1 .

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 .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để Đảm bảo Nhóm MongoDB của bạn có thể sống sót khi Amazon AWS ngừng hoạt động?

  2. Cuộc chiến của các cơ sở dữ liệu NoSQL - So sánh MongoDB và Oracle NoSQL

  3. Truy vấn IDE cho MongoDB?

  4. MongoDB phương pháp hay nhất để tham khảo

  5. Làm cách nào chúng ta có thể tạo trường được tạo Tự động cho mongodb bằng cách sử dụng khởi động mùa xuân