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

MongoDb - Ubah jenis dari Int menjadi Double

Secara default semua "angka" disimpan sebagai "ganda" di MongoDB kecuali jika umumnya dilemparkan secara berlebihan.

Ambil contoh berikut:

db.sample.insert({ "a": 1 })
db.sample.insert({ "a": NumberLong(1) })
db.sample.insert({ "a": NumberInt(1) })
db.sample.insert({ "a": 1.223 })

Ini menghasilkan koleksi seperti ini:

{ "_id" : ObjectId("559bb1b4a23c8a3da73e0f76"), "a" : 1 }
{ "_id" : ObjectId("559bb1bba23c8a3da73e0f77"), "a" : NumberLong(1) }
{ "_id" : ObjectId("559bb29aa23c8a3da73e0f79"), "a" : 1 }
{ "_id" : ObjectId("559bb30fa23c8a3da73e0f7a"), "a" : 1.223 }

Terlepas dari fungsi konstruktor yang berbeda, perhatikan bagaimana beberapa titik data di sana terlihat hampir sama. Shell MongoDB itu sendiri tidak selalu membedakan dengan jelas di antara mereka, tetapi ada cara untuk mengetahuinya.

Tentu saja ada $type operator kueri, yang memungkinkan pemilihan Jenis BSON.

Jadi uji ini dengan Tipe 1 - Yang "ganda":

> db.sample.find({ "a": { "$type": 1 } })
{ "_id" : ObjectId("559bb1b4a23c8a3da73e0f76"), "a" : 1 }
{ "_id" : ObjectId("559bb30fa23c8a3da73e0f7a"), "a" : 1.223 }

Anda melihat bahwa sisipan pertama dan yang terakhir dipilih, tetapi tentu saja tidak untuk dua lainnya.

Jadi sekarang uji BSON Tipe 16 - yang merupakan bilangan bulat 32-bit

> db.sample.find({ "a": { "$type": 16 } })
{ "_id" : ObjectId("559bb29aa23c8a3da73e0f79"), "a" : 1 }

Itu adalah penyisipan "ketiga" yang menggunakan NumberInt() fungsi di dalam cangkang. Sehingga fungsi dan serialisasi lain dari driver Anda dapat mengatur jenis BSON khusus ini.

Dan untuk BSON Type 18 - yang merupakan bilangan bulat 64-bit

> db.sample.find({ "a": { "$type": 18 } })
{ "_id" : ObjectId("559bb1bba23c8a3da73e0f77"), "a" : NumberLong(1) }

Penyisipan "kedua" yang dibuat melalui NumberLong() .

Jika Anda ingin "menyingkirkan" hal-hal yang "bukan ganda" maka Anda akan melakukannya:

db.sample.find({ "$or": [{ "a": { "$type": 16 } },{ "a": { "$type": 18 } }]})

Yang merupakan satu-satunya tipe numerik yang valid selain "ganda" itu sendiri.

Jadi untuk "mengonversi" ini di koleksi Anda, Anda dapat "Massal" proses seperti ini:

var bulk = db.sample.initializeUnorderedBulkOp(),
    count = 0;
db.sample.find({ 
    "$or": [
        { "a": { "$type": 16 } },
        { "a": { "$type": 18 } }
    ]
}).forEach(function(doc) {
    bulk.find({ "_id": doc._id })
        .updateOne({ 
            "$set": { "b": doc.a.valueOf() } ,
            "$unset": { "a": 1 } 
        });
    bulk.find({ "_id": doc._id })
        .updateOne({ "$rename": { "b": "a" } });
    count++;
    if ( count % 1000 == 0 ) {
        bulk.execute()
        bulk = db.sample.initializeUnOrderedBulkOp();
    }
})
if ( count % 1000 != 0 ) bulk.execute();

Apa yang dilakukan dilakukan dalam tiga langkah "secara massal":

  1. Tampilkan ulang nilai ke bidang baru sebagai "ganda"
  2. Hapus kolom lama dengan jenis yang tidak diinginkan
  3. Ganti nama kolom baru menjadi nama kolom lama

Ini perlu karena informasi jenis BSON "lengket" ke elemen bidang setelah dibuat. Jadi untuk "mentransmisikan ulang" Anda harus menghapus sepenuhnya data lama yang mencakup tugas lapangan asli.

Jadi itu akan menjelaskan cara "mendeteksi" dan juga "mentransmisikan ulang" jenis yang tidak diinginkan dalam dokumen Anda.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Layanan MongoDB tidak berjalan di Fedora

  2. pemetaan bidang id mongodb data pegas

  3. Bagaimana cara mengagregasi berdasarkan tanggal ketika stempel waktu penuh diberikan dalam kerangka agregasi?

  4. Bagaimana Mengakses Instans MongoDB 4.2?

  5. Cara Mudah Mengelola Pembaruan Basis Data dan Patch Keamanan