Kerangka kerja pipa agregasi MongoDB mencakup $round
operator dan $trunc
operator. Operator-operator ini melakukan tugas yang serupa, tetapi berbeda.
Definisi
Pertama, mari kita lihat definisi dari masing-masing operator:
$round
operator putaran angka ke bilangan bulat utuh atau ke tempat desimal tertentu.$truncate
operator memotong angka ke bilangan bulat utuh atau ke tempat desimal tertentu.
Pada dasarnya, perbedaannya ada pada kata bulat vs memotong .
Dalam beberapa kasus, kedua operator akan mengembalikan hasil yang sama. Dalam kasus lain, hasilnya akan berbeda. Ini karena $round
operator dapat membulatkan angka ke atas, tergantung pada nilainya. $truncate
operator tidak membulatkan angka. Sebaliknya, itu hanya memotongnya. Dengan kata lain, itu hanya memotong nomor seperti yang ditentukan, sambil membiarkan digit yang tersisa apa adanya.
Contoh
Misalkan kita memiliki koleksi yang disebut test
dengan dokumen sebagai berikut:
{ "_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 }
Inilah yang terjadi ketika kita menerapkan $round
dan $truncate
ke dokumen-dokumen itu:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data" ] },
truncated: { $trunc: [ "$data" ] }
}
}
]
)
Hasil:
{ "data" :0, "dibulatkan" :0, "terpotong" :0 }{ "data" :8, "dibulatkan" :8, "dipotong" :8 }{ "data" :0,5, "dibulatkan " :0, "terpotong" :0 }{ "data" :0.9, "dibulatkan" :1, "dipotong" :0 }{ "data" :8.99, "dibulatkan" :9, "dipotong" :8 }{ " data" :8.45, "dibulatkan" :8, "terpotong" :8 }{ "data" :8.451, "dibulatkan" :8, "dipotong" :8 }{ "data" :-8.99, "dibulatkan" :-9 , "terpotong" :-8 }{ "data" :-8.45, "dibulatkan" :-8, "terpotong" :-8 }{ "data" :-8.451, "dibulatkan" :-8, "terpotong" :- 8 }
Kita dapat melihat bahwa dalam beberapa kasus, hasilnya sama. Di tempat lain, itu berbeda. Misalnya, ketika nilai input adalah 0.9
, $round
operator membulatkan angka menjadi 1
. $truncate
operator di sisi lain hanya menghapus .9
bagian, yang menghasilkan hasil 0
.
Tempat Pecahan Negatif
Kedua operator menerima argumen kedua opsional. Saat ada, argumen ini menentukan jumlah tempat desimal untuk membulatkan/memotong angka tersebut.
Memberikan argumen kedua ini lebih lanjut dapat menyoroti perbedaan antara kedua operator.
Contoh:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", 1 ] },
truncated: { $trunc: [ "$data", 1 ] }
}
}
]
)
Hasil:
{ "data" :0, "dibulatkan" :0, "terpotong" :0 }{ "data" :8, "dibulatkan" :8, "dipotong" :8 }{ "data" :0,5, "dibulatkan " :0,5, "terpotong" :0,5 }{ "data" :0,9, "dibulatkan" :0,9, "terpotong" :0,9 }{ "data" :8,99, "dibulatkan" :9, "terpotong" :8,9 }{ " data" :8.45, "dibulatkan" :8.4, "terpotong" :8.4 }{ "data" :8.451, "dibulatkan" :8.5, "dipotong" :8.4 }{ "data" :-8.99, "dibulatkan" :-9 , "terpotong" :-8.9 }{ "data" :-8.45, "dibulatkan" :-8.4, "terpotong" :-8.4 }{ "data" :-8.451, "dibulatkan" :-8.5, "terpotong" :- 8.4 }
Sekali lagi kita dapat melihat bahwa beberapa hasil identik sementara yang lain tidak.
Tempat Pecahan Negatif
Kedua operator menerima nilai negatif untuk argumen kedua.
Contoh:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", -1 ] },
truncated: { $trunc: [ "$data", -1 ] }
}
}
]
)
Hasil:
{ "data" :0, "dibulatkan" :0, "dipotong" :0 }{ "data" :8, "dibulatkan" :10, "dipotong" :0 }{ "data" :0,5, "dibulatkan " :0, "terpotong" :0 }{ "data" :0.9, "dibulatkan" :0, "terpotong" :0 }{ "data" :8.99, "dibulatkan" :10, "dipotong" :0 }{ " data" :8.45, "dibulatkan" :10, "terpotong" :0 }{ "data" :8.451, "dibulatkan" :10, "dipotong" :0 }{ "data" :-8.99, "dibulatkan" :-10 , "terpotong" :0 }{ "data" :-8.45, "dibulatkan" :-10, "terpotong" :0 }{ "data" :-8.451, "dibulatkan" :-10, "terpotong" :0 }Kali ini ada kontras yang mencolok antara hasil yang dihasilkan oleh kedua operator tersebut.
$trunc
operator menghasilkan0
untuk setiap dokumen, sedangkan$round
operator mengembalikan berbagai nilai, sebagian besar dibulatkan ke atas atau ke bawah.$floor dan $ceil
Dua operator lagi yang harus diperhatikan saat melakukan operasi seperti ini adalah
$floor
dan$ceil
. Operator-operator ini bekerja dengan cara yang sama, tetapi sedikit berbeda.
$floor
mengembalikan terbesar bilangan bulat kurang dari atau sama dengan angka yang ditentukan$ceil
mengembalikan terkecil bilangan bulat yang lebih besar dari atau sama dengan angka yang ditentukan.