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

MongoDB $ ln

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 .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $ hoặc truy vấn

  2. Vị trí của cơ sở dữ liệu mongodb trên mac

  3. mongodb tìm theo nhiều mục mảng

  4. Nhận thông báo cho các tài liệu đã thay đổi trong mongodb

  5. Tạo Bộ sưu tập trong MongoDB