Bagi saya, cara paling sederhana untuk mengetahui cara memformat "CSV" Anda untuk mongoimport
adalah cukup membuat koleksi lalu gunakan mongoexport
di atasnya untuk melihat seperti apa format CSV.
Jadi buat dokumen Anda dari shell:
db.newcol.insert({
id:"122234343",
name: "name1",
children: ["222334444","333344444"]
})
Kemudian keluar dari shell dan jalankan mongoexport
:
mongoexport -d test -c testcol --fields id,name,children --type csv > out.csv
Yang akan menampilkan output sebagai:
id,name,children
122234343,name1,"[""222334444"",""333344444""]"
Di mana "array" diwakili dengan "string" dan menggunakan tanda kutip ""
dalam bentuk pelarian mereka.
Itu sekarang adalah tempat yang cukup jelas untuk menggunakan mongoimport
dari, jadi cukup "impor" sekarang untuk menguji:
mongoimport -d test -c newcol --headerline --type csv out.csv
Masukkan kembali shell dan lihat dokumen dalam koleksi baru:
db.newcol.findOne()
{
"_id" : ObjectId("59476924d6eb0b7d6ac37e02"),
"id" : 122234343,
"name" : "name1",
"children" : "[\"222334444\",\"333344444\"]"
}
Jadi semuanya ada di sana, TAPI anak-anak terdaftar sebagai "string" daripada array. Tapi ini sebenarnya bukan masalah, karena kita mendapatkan data yang diimpor dan sekarang tinggal kita yang benar-benar mengubahnya:
var ops = [];
db.testcol.find({ "children": { "$type": 2} }).forEach(doc => {
var children = doc.children.split(',').map( e => e.replace(/"|\[|\]|\\/gm,'').toString() );
ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "children": children } }
}
});
if ( ops.length >= 1000 ) {
db.newcol.bulkWrite(ops);
ops = [];
}
});
if ( ops.length > 0 ) {
db.newcol.bulkWrite(ops);
ops = [];
}
Jadi itu akan mengulangi apa pun yang diimpor ke dalam koleksi yang memiliki tipe BSON 2 yaitu "string" melalui $type
operator kueri.
Kemudian kami mengambil string, membaginya sebagai array dan menghapus karakter lain untuk hanya meninggalkan nilai yang Anda inginkan.
Menggunakan .bulkWrite()
Anda melakukan pembaruan tersebut dengan cara yang efisien, daripada menulis setiap dokumen per permintaan. Mereka sebenarnya dikirim dalam 1000 batch ke server.
Hasil akhirnya adalah dokumen dalam bentuk asli yang diinginkan:
db.testcol.findOne()
{
"_id" : ObjectId("5947652ccb237bd6e4e902a5"),
"id" : "122234343",
"name" : "name1",
"children" : [
"222334444",
"333344444"
]
}
Jadi itulah "langkah demi langkah" saya tentang bagaimana Anda dapat mengerjakan format CSV Anda, mengimpornya dan kemudian "mengubah" data menjadi keadaan yang Anda butuhkan.