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

Impor data csv sebagai array di mongodb menggunakan mongoimport

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara menguji unit metode yang terhubung ke mongo, tanpa benar-benar terhubung ke mongo?

  2. Kapan saya harus menggunakan database NoSQL daripada database relasional? Apakah boleh menggunakan keduanya di situs yang sama?

  3. Pencadangan MongoDB Otomatis

  4. Pencarian peka huruf besar/kecil di Mongo

  5. Bagaimana cara kerja penyortiran di ekstensi PECL mongodb baru?