Adakah kemungkinan contoh - mengubah jenis bidang dari int ke string (atau sebaliknya), dari shell?
Alister Bulman
30
dalam hal Int32-> String, new String(x.bad)membuat koleksi String dengan nilai 0-index-item x.bad. Varian ""+x.bad, yang dideskripsikan oleh Simone berfungsi sesuai keinginan - menciptakan nilai String alih-alih Int32
Dao
Kode di atas adalah mengkonversi data lapangan dari ganda ke array bukan ganda ke string. Data aktual saya adalah dalam format ini: 3.1 sedangkan kode simone berfungsi dengan baik untuk saya
Pankaj Khurana
2
Punya situasi di mana saya perlu mengubah bidang _id dan juga tidak bertentangan dengan indeks lain:db.questions.find({_id:{$type:16}}).forEach( function (x) { db.questions.remove({_id:x._id},true); x._id = ""+x._id; db.questions.save(x); });
Matt Molnar
@SundarBons ya Anda menulis ulang bidang di seluruh basis data Anda, ini adalah masalah besar bagaimana pun Anda melakukannya. Jika Anda menggunakan SQL dan ini adalah tabel besar Anda mungkin harus mengambil waktu istirahat.
Ini hebat - tahukah Anda bagaimana Anda mengonversi string (pikirkan mata uang seperti '1,23') ke integer 123? Saya berasumsi Anda harus menguraikannya sebagai float atau desimal, kalikan dengan 100, lalu simpan sebagai bilangan bulat, tetapi saya tidak dapat menemukan dokumen yang tepat untuk melakukan ini. Terima kasih!
Brian Armstrong
Sebenarnya kerja ini bagus. Tapi saya punya aplikasi yang berjalan dengan mongoid 2.4.0-stable yang memiliki bidang seperti bidang: customer_count, ketik: Integer & validasi sebagai validates_numericality_of: customer_count yang berfungsi dengan baik. Sekarang ketika saya meningkatkan ke mongoid ke 3.0.16, ketika saya menetapkan nilai string secara otomatis mengubahnya menjadi 0. tanpa kesalahan. Saya ingin melempar kesalahan pada tugas data yang salah, perilaku ini ternyata aneh bagi saya.
Swapnil Chincholkar
4
Saya menjalankan ini dan mendapatkan kesalahan: Kesalahan: tidak dapat mengonversi string ke integer (shell): 1
Mittenchops
Dan jika Anda perlu mengubah string (atau "normal" integer 32-bit) ke integer 64-bit, gunakan NumberLongseperti di sini:db.db-name.find({field-name : {$exists : true}}).forEach( function(obj) { obj.field-name = new NumberLong(obj.field-name); db.db-name.save(obj); } );
boryn
ini bekerja dengan baik. Bolehkah saya tahu cara mengubah tipe data dalam bidang dokumen yang disematkan
Bagian pertama { a : { $type: 1 } }adalah kueri kecocokan:
Ini menyaring dokumen mana yang akan diperbarui.
Dalam hal ini, karena kami ingin mengonversi "a"ke string ketika nilainya dua kali lipat, ini cocok dengan elemen yang "a"bertipe 1(ganda)).
Tabel ini menyediakan kode-kode yang mewakili berbagai tipe yang mungkin.
Bagian kedua [{ $set: { a: { $toString: "$a" } } }]adalah pipa agregasi pembaruan:
Perhatikan tanda kurung kotak yang menandakan bahwa permintaan pembaruan ini menggunakan pipa agregasi.
$setadalah operator agregasi baru ( Mongo 4.2) yang dalam hal ini memodifikasi bidang.
Ini dapat dengan mudah dibaca sebagai "$set"nilai "a"untuk "$a"dikonversi "$toString".
Apa yang benar-benar baru di sini, dapat Mongo 4.2merujuk dokumen itu sendiri ketika memperbaruinya: nilai baru untuk "a"didasarkan pada nilai yang ada "$a".
Juga catat "$toString"operator agregasi baru yang diperkenalkan di Mongo 4.0.
Jangan lupa { multi: true }, jika tidak , hanya dokumen yang cocok pertama yang akan diperbarui.
Dalam kasus cor Anda tidak dari ganda string, Anda memiliki pilihan antara operator konversi yang berbeda diperkenalkan di Mongo 4.0seperti $toBool, $toInt...
Dan jika tidak ada konverter khusus untuk tipe yang Anda targetkan, Anda bisa menggantinya { $toString: "$a" }dengan $convertoperasi: di { $convert: { input: "$a", to: 2 } }mana nilai untuk todapat ditemukan dalam tabel ini :
db.collection.update({ a :{ $type:1}},[{ $set:{ a:{ $convert:{ input:"$a", to:2}}}}],{ multi:true})
Pada tahun 2020, menggunakan $ convert harus menjadi metode yang benar untuk ini karena harus jauh lebih efisien (dan lebih mudah digunakan untuk boot).
KhalilRavanna
10
semua jawaban sejauh ini menggunakan beberapa versi forEach, iterasi semua elemen koleksi sisi klien.
Namun, Anda bisa menggunakan pemrosesan sisi server MongoDB dengan menggunakan pipa agregat dan tahap $ out sebagai:
tahap $ out secara atomik menggantikan koleksi yang ada dengan koleksi hasil baru.
Saya tidak tahu mengapa ini tidak terunggulkan lagi. Operasi baris demi baris pada set data besar adalah pembunuhan pada kinerja
Alf47
7
Untuk mengonversi bidang tipe string ke bidang tanggal, Anda perlu mengulangi kursor yang dikembalikan oleh find()metode menggunakan forEach()metode, dalam lingkaran, konversi bidang ke objek Tanggal dan kemudian perbarui bidang menggunakan $setoperator.
Manfaatkan menggunakan API Massal untuk pembaruan massal yang menawarkan kinerja lebih baik karena Anda akan mengirim operasi ke server dalam batch katakanlah 1000 yang memberi Anda kinerja yang lebih baik karena Anda tidak mengirim setiap permintaan ke server, hanya sekali dalam setiap 1000 permintaan.
Berikut ini menunjukkan pendekatan ini, contoh pertama menggunakan API Massal yang tersedia dalam versi MongoDB >= 2.6 and < 3.2. Ini memperbarui semua dokumen dalam koleksi dengan mengubah semua created_atbidang ke bidang tanggal:
var bulk = db.collection.initializeUnorderedBulkOp(),
counter =0;
db.collection.find({"created_at":{"$exists":true,"$type":2}}).forEach(function(doc){var newDate =newDate(doc.created_at);
bulk.find({"_id": doc._id }).updateOne({"$set":{"created_at": newDate}});
counter++;if(counter %1000==0){
bulk.execute();// Execute per 1000 operations and re-initialize every 1000 update statements
bulk = db.collection.initializeUnorderedBulkOp();}})// Clean up remaining operations in queueif(counter %1000!=0){ bulk.execute();}
Saya perlu mengubah tipe data beberapa bidang dalam koleksi, jadi saya menggunakan yang berikut ini untuk membuat beberapa perubahan tipe data dalam kumpulan dokumen. Jawab pertanyaan lama tetapi mungkin bermanfaat bagi orang lain.
db.mycoll.find().forEach(function(obj){if(obj.hasOwnProperty('phone')){
obj.phone =""+ obj.phone;// int or longint to string}if(obj.hasOwnProperty('field-name')){
obj.field-name =newNumberInt(obj.field-name);//string to integer}if(obj.hasOwnProperty('cdate')){
obj.cdate =newISODate(obj.cdate);//string to Date}
db.mycoll.save(obj);});
You can easily convert the string data type to numerical data type.Don't forget to change collectionName &FieldName.for ex :CollectionNmae:Users&FieldName:Contactno.
toString
bidang dokumen, inilah program kecil yang saya buat / gunakan .Jawaban:
Satu-satunya cara untuk mengubah
$type
data adalah dengan melakukan pembaruan pada data di mana data memiliki tipe yang benar.Dalam hal ini, sepertinya Anda mencoba mengubah
$type
dari 1 (dobel) ke 2 (dawai) .Jadi cukup muat dokumen dari DB, lakukan cast (
new String(x)
) dan kemudian simpan dokumen lagi.Jika Anda perlu melakukan ini secara terprogram dan seluruhnya dari shell, Anda dapat menggunakan
find(...).forEach(function(x) {})
sintaks.Menanggapi komentar kedua di bawah ini. Ubah bidang
bad
dari angka menjadi string dalam koleksifoo
.sumber
new String(x.bad)
membuat koleksi String dengan nilai 0-index-itemx.bad
. Varian""+x.bad
, yang dideskripsikan oleh Simone berfungsi sesuai keinginan - menciptakan nilai String alih-alih Int32db.questions.find({_id:{$type:16}}).forEach( function (x) { db.questions.remove({_id:x._id},true); x._id = ""+x._id; db.questions.save(x); });
Konversi bidang String ke Integer:
Konversi bidang Integer ke String:
sumber
NumberLong
seperti di sini:db.db-name.find({field-name : {$exists : true}}).forEach( function(obj) { obj.field-name = new NumberLong(obj.field-name); db.db-name.save(obj); } );
Untuk konversi string ke int.
Untuk konversi string ke ganda.
Untuk mengapung:
sumber
radix
- developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…new NumberInt()
sumber
Mulai
Mongo 4.2
,db.collection.update()
dapat menerima pipa agregasi, akhirnya memungkinkan pembaruan bidang berdasarkan nilainya sendiri:Bagian pertama
{ a : { $type: 1 } }
adalah kueri kecocokan:"a"
ke string ketika nilainya dua kali lipat, ini cocok dengan elemen yang"a"
bertipe1
(ganda)).Bagian kedua
[{ $set: { a: { $toString: "$a" } } }]
adalah pipa agregasi pembaruan:$set
adalah operator agregasi baru (Mongo 4.2
) yang dalam hal ini memodifikasi bidang."$set"
nilai"a"
untuk"$a"
dikonversi"$toString"
.Mongo 4.2
merujuk dokumen itu sendiri ketika memperbaruinya: nilai baru untuk"a"
didasarkan pada nilai yang ada"$a"
."$toString"
operator agregasi baru yang diperkenalkan diMongo 4.0
.Jangan lupa
{ multi: true }
, jika tidak , hanya dokumen yang cocok pertama yang akan diperbarui.Dalam kasus cor Anda tidak dari ganda string, Anda memiliki pilihan antara operator konversi yang berbeda diperkenalkan di
Mongo 4.0
seperti$toBool
,$toInt
...Dan jika tidak ada konverter khusus untuk tipe yang Anda targetkan, Anda bisa menggantinya
{ $toString: "$a" }
dengan$convert
operasi: di{ $convert: { input: "$a", to: 2 } }
mana nilai untukto
dapat ditemukan dalam tabel ini :sumber
db.collection.updateMany( { a : { $type: 1 } }, [{ $set: { a: { $toString: "$a" } } }] )
-multi : true
dapat dihindari menggunakanupdateMany
semua jawaban sejauh ini menggunakan beberapa versi forEach, iterasi semua elemen koleksi sisi klien.
Namun, Anda bisa menggunakan pemrosesan sisi server MongoDB dengan menggunakan pipa agregat dan tahap $ out sebagai:
contoh:
sumber
Untuk mengonversi bidang tipe string ke bidang tanggal, Anda perlu mengulangi kursor yang dikembalikan oleh
find()
metode menggunakanforEach()
metode, dalam lingkaran, konversi bidang ke objek Tanggal dan kemudian perbarui bidang menggunakan$set
operator.Manfaatkan menggunakan API Massal untuk pembaruan massal yang menawarkan kinerja lebih baik karena Anda akan mengirim operasi ke server dalam batch katakanlah 1000 yang memberi Anda kinerja yang lebih baik karena Anda tidak mengirim setiap permintaan ke server, hanya sekali dalam setiap 1000 permintaan.
Berikut ini menunjukkan pendekatan ini, contoh pertama menggunakan API Massal yang tersedia dalam versi MongoDB
>= 2.6 and < 3.2
. Ini memperbarui semua dokumen dalam koleksi dengan mengubah semuacreated_at
bidang ke bidang tanggal:Contoh berikutnya berlaku untuk versi MongoDB baru
3.2
yang sejak itu sudah tidak lagi menggunakan API Massal dan menyediakan perangkat apis yang lebih baru menggunakanbulkWrite()
:sumber
Untuk mengkonversi int32 ke string dalam mongo tanpa membuat array cukup tambahkan "" ke nomor Anda :-)
sumber
Apa yang benar-benar membantu saya untuk mengubah jenis objek di MondoDB hanyalah garis sederhana ini, mungkin disebutkan sebelumnya di sini ...:
Pengguna adalah koleksi saya dan usia adalah objek yang memiliki string bukan bilangan bulat (int32).
sumber
Saya perlu mengubah tipe data beberapa bidang dalam koleksi, jadi saya menggunakan yang berikut ini untuk membuat beberapa perubahan tipe data dalam kumpulan dokumen. Jawab pertanyaan lama tetapi mungkin bermanfaat bagi orang lain.
sumber
Coba kueri ini ..
sumber
demo mengubah jenis bidang pertengahan dari string ke objek mongo menggunakan luwak
Mongo ObjectId hanyalah contoh gaya seperti
Nomor, string, boolean yang berharap jawabannya akan membantu orang lain.
sumber
Saya menggunakan skrip ini di konsol mongodb untuk string untuk mengapung konversi ...
Dan yang ini di php)))
sumber
dalam kasus saya, saya menggunakan berikut ini
sumber