MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB $round vs $trunc:Apa Bedanya?

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 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.

  • $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.

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Populasi luwak vs objek bersarang

  2. cara menanyakan objek anak di mongodb

  3. Pengertian Meteor Publikasikan / Berlangganan

  4. Bandingkan array dan Kembalikan Perbedaannya

  5. Solusi MongoDB untuk dokumen di atas ukuran 16mb?