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

Angkat toko BigDecimal di MongoDB

Pada MongoDB v2.6 tidak ada tipe desimal tempat tetap. Data harus disimpan di bidang dengan jenis yang berbeda dan aplikasi harus melakukan terjemahan setiap saat.

Berpotensi lib perantara dapat melakukan terjemahan ini alih-alih aplikasi Anda. Saya kira net.liftweb.record tidak.

Jika tipe ganda cukup untuk bidang yang dimaksud, saya sarankan mengubahnya untuk kesederhanaan. Tetapi dengan asumsi Anda menggunakan BigDecimal untuk alasan yang baik, ada solusi yang terkenal. Ini adalah:

(1) Simpan sebagai string . Anda dapat memiliki presisi sewenang-wenang. Tetapi pengurutan atau kueri untuk kecocokan nilai yang tepat hanya akan berfungsi jika Anda mengisi sisi kiri dengan nol hingga panjang tetap setiap waktu. Bahkan kemudian angka positif dan negatif adalah dua rentang yang berbeda dari segi penyortiran. Negatif perlu diurutkan secara terbalik untuk memiliki penyortiran numerik yang benar. Contoh urutan MongoDB secara alami akan mengembalikan nomor string yang diisi nol ini:

"-0000054321.9876"
"-0000100322"
"0000054321.9876"
"0000100322"

Saya yakin tipe BigDecimal memiliki konstruktor dari nilai string, jadi ini mungkin yang paling mudah diterapkan dalam fungsi terjemahan aplikasi Anda.

(2) Simpan sebagai panjang yang digeser (Int64) . Penyortiran berfungsi, lebih sedikit ruang disk yang digunakan, tidak ada masalah dengan negatif vs. positif. Membutuhkan pergeseran nilai ke atas dengan kelipatan tetap yang membuat sedikit tidak dapat dibaca saat melihat database secara langsung. Presisi harus diperbaiki agar sama untuk semua nilai di seluruh koleksi- OK untuk kasus penggunaan finansial; tidak OK untuk beberapa kasus penggunaan ilmiah.

(3) Simpan sebagai pasangan angka , satu untuk kedua sisi titik desimal. Penyortiran membutuhkan sedikit kerja ekstra. Jika menggunakan angka Int32, presisi akan dibatasi hingga 9 digit di kedua sisi desimal. Melihat dua kolom di db alih-alih satu tentu saja lebih sulit.

Untuk contoh kode Scala, saya menemukan driver Reaktif untuk proyek MongoDB telah mendokumentasikan tiga solusi serialisasi untuk BigDecimal . Yang pertama menggunakan ganda; dua yang terakhir mengambil pendekatan lain- buat seluruh sub-dokumen untuk nilai BigDecimal. Mencoba untuk mengkueri nilai yang dibungkus dalam sub-dokumen akan sulit saya duga.

Lainnya kasus kehidupan nyata dari blog tim pengembang Ebay (Morphia/Java)

P.S. mungkin MongoDB akan menambahkan tipe desimal di masa mendatang. Ada permintaan fitur terbuka yang dapat Anda tonton/upvote - https://jira. mongodb.org/browse/SERVER-1393




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mengonversi string menjadi tanggal di mongodb

  2. Bagaimana cara menemukan koleksi kode dengan regex dan kriteria kompleks menggunakan driver Java MongoDB?

  3. Mongo:kesalahan jaringan saat mencoba menjalankan perintah 'whatsmyuri' di host

  4. Cara mencari sub array di MongoDB

  5. MongoConnectionException - Tidak ada kandidat server yang ditemukan