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

MongoDB $ round so với $ trunc:Sự khác biệt là gì?

Khung đường dẫn tổng hợp của MongoDB bao gồm $round toán tử và $trunc nhà điều hành. Các toán tử này thực hiện các nhiệm vụ tương tự, nhưng khác nhau.

Định nghĩa

Trước tiên, hãy xem định nghĩa của từng toán tử:

  • $round toán tử vòng một số đến một số nguyên hoặc đến một vị trí thập phân được chỉ định.
  • $truncate toán tử truncates một số đến một số nguyên hoặc đến một vị trí thập phân được chỉ định.

Về cơ bản, sự khác biệt là ở các từ vòng so với cắt ngắn .

Trong một số trường hợp, cả hai toán tử sẽ trả về cùng một kết quả. Trong các trường hợp khác, kết quả của chúng sẽ khác nhau. Điều này là do $round toán tử có thể làm tròn số lên, tùy thuộc vào giá trị. $truncate toán tử không làm tròn số. Thay vào đó, nó chỉ đơn giản là cắt ngắn nó. Nói cách khác, nó chỉ đơn giản là cắt số như đã chỉ định, trong khi giữ nguyên các chữ số còn lại.

Ví dụ

Giả sử chúng ta có một bộ sưu tập được gọi là test với các tài liệu sau:

{ "_id" : 1, "data" : 8.99 }
{ "_id" : 2, "data" : 8.45 }
{ "_id" : 3, "data" : 8.451 }
{ "_id" : 4, "data" : -8.99 }
{ "_id" : 5, "data" : -8.45 }
{ "_id" : 6, "data" : -8.451 }
{ "_id" : 7, "data" : 8 }
{ "_id" : 8, "data" : 0 }
{ "_id" : 9, "data" : 0.5 }
{ "_id" : 10, "data" : 8111.32 }
{ "_id" : 11, "data" : 8514.321 }
{ "_id" : 12, "data" : 8999.454 }

Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $round$truncate đối với các tài liệu đó:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data" ] },
            truncated: { $trunc: [ "$data" ] }
          }
     }
   ]
)

Kết quả:

{ "data" : 0, "rounded" : 0, "truncated" : 0 }
{ "data" : 8, "rounded" : 8, "truncated" : 8 }
{ "data" : 0.5, "rounded" : 0, "truncated" : 0 }
{ "data" : 0.9, "rounded" : 1, "truncated" : 0 }
{ "data" : 8.99, "rounded" : 9, "truncated" : 8 }
{ "data" : 8.45, "rounded" : 8, "truncated" : 8 }
{ "data" : 8.451, "rounded" : 8, "truncated" : 8 }
{ "data" : -8.99, "rounded" : -9, "truncated" : -8 }
{ "data" : -8.45, "rounded" : -8, "truncated" : -8 }
{ "data" : -8.451, "rounded" : -8, "truncated" : -8 }

Chúng ta có thể thấy rằng trong một số trường hợp, kết quả là như nhau. Ở những người khác, nó khác. Ví dụ:khi giá trị đầu vào là 0.9 , $round toán tử làm tròn số lên đến 1 . $truncate mặt khác, toán tử chỉ cần xóa .9 phần này tạo ra kết quả là 0 .

Địa điểm phân số phủ định

Cả hai toán tử đều chấp nhận đối số thứ hai tùy chọn. Khi xuất hiện, đối số này chỉ định số vị trí thập phân để làm tròn / cắt bớt số thành.

Việc cung cấp đối số thứ hai này có thể làm nổi bật thêm sự khác biệt giữa hai toán tử.

Ví dụ:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data", 1 ] },
            truncated: { $trunc: [ "$data", 1 ] }
          }
     }
   ]
)

Kết quả:

{ "data" : 0, "rounded" : 0, "truncated" : 0 }
{ "data" : 8, "rounded" : 8, "truncated" : 8 }
{ "data" : 0.5, "rounded" : 0.5, "truncated" : 0.5 }
{ "data" : 0.9, "rounded" : 0.9, "truncated" : 0.9 }
{ "data" : 8.99, "rounded" : 9, "truncated" : 8.9 }
{ "data" : 8.45, "rounded" : 8.4, "truncated" : 8.4 }
{ "data" : 8.451, "rounded" : 8.5, "truncated" : 8.4 }
{ "data" : -8.99, "rounded" : -9, "truncated" : -8.9 }
{ "data" : -8.45, "rounded" : -8.4, "truncated" : -8.4 }
{ "data" : -8.451, "rounded" : -8.5, "truncated" : -8.4 }

Một lần nữa, chúng ta có thể thấy rằng một số kết quả giống hệt nhau trong khi những kết quả khác thì không.

Địa điểm phân số phủ định

Cả hai toán tử đều chấp nhận giá trị âm cho đối số thứ hai.

Ví dụ:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data", -1 ] },
            truncated: { $trunc: [ "$data", -1 ] }
          }
     }
   ]
)

Kết quả:

{ "data" : 0, "rounded" : 0, "truncated" : 0 }
{ "data" : 8, "rounded" : 10, "truncated" : 0 }
{ "data" : 0.5, "rounded" : 0, "truncated" : 0 }
{ "data" : 0.9, "rounded" : 0, "truncated" : 0 }
{ "data" : 8.99, "rounded" : 10, "truncated" : 0 }
{ "data" : 8.45, "rounded" : 10, "truncated" : 0 }
{ "data" : 8.451, "rounded" : 10, "truncated" : 0 }
{ "data" : -8.99, "rounded" : -10, "truncated" : 0 }
{ "data" : -8.45, "rounded" : -10, "truncated" : 0 }
{ "data" : -8.451, "rounded" : -10, "truncated" : 0 }

Lần này có sự tương phản hoàn toàn giữa kết quả do hai nhà khai thác tạo ra. $trunc nhà điều hành sản xuất 0 cho mọi tài liệu, trong khi $round toán tử trả về các giá trị khác nhau, hầu hết được làm tròn lên hoặc xuống.

$ tầng và $ ceil

Hai toán tử khác cần lưu ý khi thực hiện các thao tác như thế này là $floor$ceil . Các toán tử này hoạt động theo kiểu tương tự, nhưng hơi khác một chút.

  • $floor trả về lớn nhất số nguyên nhỏ hơn hoặc bằng số đã chỉ định
  • $ceil trả về giá trị nhỏ nhất số nguyên lớn hơn hoặc bằng số đã chỉ định.

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách tiếp tục chèn sau lỗi trùng lặp khóa bằng PyMongo

  2. Triển khai MongoDB bằng Docker

  3. GSSException:Không có thông tin xác thực hợp lệ được cung cấp (Cấp cơ chế:Không tìm thấy bất kỳ Kerberos tgt nào)

  4. Các tài liệu phụ Mongoose so với lược đồ lồng nhau

  5. Cách giải mã hóa một đối tượng BsonDocument trở lại lớp