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
và $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
và $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.