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:
$roundoperator putaran angka ke bilangan bulat utuh atau ke tempat desimal tertentu.$truncateoperator 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 menghasilkan 0 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.
$floormengembalikan terbesar bilangan bulat kurang dari atau sama dengan angka yang ditentukan$ceilmengembalikan terkecil bilangan bulat yang lebih besar dari atau sama dengan angka yang ditentukan.