Advertisement
  1. Code
  2. Node.js

Import massal file CSV ke dalam MongoDB Menggunakan Mongoose dengan Node.js

by
Read Time:11 minsLanguages:
This post is part of a series called An Introduction to Mongoose for MongoDB and Node.js.
An Introduction to Mongoose for MongoDB and Node.js

Indonesian (Bahasa Indonesia) translation by Lukman Nulhakim (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Topik ini sangat menyenangkan bagi saya. Ini cukup umum di banyak aplikasi web untuk menerima input pengguna dan menyimpan satu catatan ke database Anda. Tetapi bagaimana dengan "kapan pengguna Anda (atau Anda) ingin melakukan beberapa penyisipan dalam satu perintah?"

Masuk ke dalam artikel ini, yang akan menunjukkan cara membuat template CSV dan formulir untuk mengunggah file CSV, dan cara menguraikan CSV ke dalam Model Mongoose yang akan disimpan ke database MongoDB.

Artikel ini mengasumsikan bahwa Anda memiliki pemahaman dasar tentang Mongoose dan bagaimana ia berinteraksi dengan MongoDB. Jika tidak, saya akan menyarankan anda membaca artikel Pengantar untuk Mongoose untuk MongoDB dan Node.js saya terlebih dahulu. Artikel ini menjelaskan cara Mongoose berinteraksi dengan MongoDB dengan membuat Skema yang diketik dengan sangat kuat yang dibuat oleh Model. Jika Anda sudah memiliki pemahaman yang baik tentang Mongoose, maka mari kita lanjutkan.

Persiapan

Untuk memulai, mari kita instantiate aplikasi Node.js baru. Pada prompt perintah, arahkan ke tempat Anda ingin menghosting aplikasi Node.js Anda dan lakukan perintah berikut:

Saya telah meninggalkan semua default di tempat, jadi aplikasi saya akan mulai dengan index.js. Sebelum membuat dan mem-parsing file CSV, beberapa pengaturan awal harus dilakukan terlebih dahulu Saya ingin membuat aplikasi web; untuk melakukan itu, saya akan menggunakan paket Express untuk menangani semua seluk beluk pengaturan server. Di command prompt Anda, instal Express dengan menjalankan perintah berikut:

Karena aplikasi web ini akan menerima file melalui formulir web, saya juga akan menggunakan sub-paket Express Express Upload File. Mari instal sekarang juga:

sekarang saya sudah cukup melakukan konfigurasi awal untuk mengatur aplikasi web saya dan membuat halaman web dasar yang akan membuat formulir upload file saya.

Berikut ini file index.js saya yang mengatur server web saya:

Contoh ini mengimpor Express dan library Unggahan File Ekspres, mengkonfigurasi aplikasi web saya untuk menggunakan Unggahan File, dan merespon pada port 80. Contoh ini juga telah membuat rute menggunakan Express di "/" yang akan menjadi halaman arahan default untuk aplikasi web saya. Rute ini mengembalikan file index.html yang berisi formulir web yang memungkinkan pengguna mengunggah file CSV. Dalam kasus saya, saya menjalankan komputer lokal saya, jadi ketika saya mengunjungi http://localhost saya akan melihat formulir yang saya buat di halaman selanjutnya.

Berikut adalah halaman index.html yang membuat formulir saya untuk mengunggah file CSV:

File HTML ini terdiri dari 2 hal penting:

  1. Sebuah tautan ke "/template" yang, saat diklik, akan mengunduh template CSV yang bisa diisi dengan informasi untuk diimport.
  2. Sebuah form dengan encType sitetapkan sebagai multipart/form-data dan sebuah field masukan dengan tipe file yang menerima file dengan ekstensi "csv"

Seperti yang anda perhatikan, HTML membuat referensi ke template si author. Jika Anda membaca pengantar artikel saya tentang Mongoose, saya membuat Skema author. Dalam artikel ini, saya akan membuat ulang skema ini dan memungkinkan pengguna untuk melakukan import koleksi dari si author dalam jumlah besar ke dalam database MongoDB. Mari kita lihat ke skema author. Sebelum melakukan itu, Anda mungkin sudah menebaknya — kita perlu menginstal paket Mongoose:

Membuat Skema dan Model

Dengan Mongoose diinstall, Mari kita buat file author.js baru yang akan menjelaskan Skema dan Model si author:

Dengan sekma dan model buatan si author, mari kita pindah persneling dan fokus pada pembuatan template CSV yang dapat diunduh dengan mengklik pada tautan template. Untuk membantu pembuatan template CSV, saya akan menggunakan paket JSON ke CSV. Mari instal sekarang:

Saya akan memperbarui file index.js buatan saya sebelumnya untuk memasukkan sebuah rute baru untuk "/template":

Saya hanya memasukkan code baru untuk rute template yang ditambahkan ke file index.js sebelumnya.

Hal pertama yang dilakukan oleh code ini adalah memasukkan file template.js baru (untuk dibuat selanjutnya) dan membuat sebuah rute untuk "/template". Rute ini akan memanggil fungsi get dalam file template.js.

Dengan server ekspres diperbarui untuk memasukkan rute baru, mari kita buat file template.jsbaru:

File ini memasukkan paket json2csv yang diinstal sebelumnya. Kemudian saya membuat dan meng-export fungsi get. Fungsi ini menerima objek permintaan dan tanggapan dari servr ekspres.

Dalam fungsi tersebut, saya sudah membuat sebuah array dari berbagai field yang ingin saya masukan dalam template CSV saya. Hal ini dapat dilakukan dengan satu dari dua cara. Cara pertama (yang dilakukan dalam contoh ini) adalah untuk membuat sebuah daftar statis dari berbagai field untuk dimasukkan di dalam template. Cara kedua adalah untuk membuat daftar dari berbagai field secara dinamis dengan mengekstrak properti-properti dari skema si author.

Cara kedua dapat dilakukan dengam code sebagai berikut:

Saya ingin menggunakan metode dinamis ini, namun hal ini menjadi sedikit rumit saat saya tidak ingin memasukkan beberapa properti dari skema ke template CSV saya. Dalam hal ini, template saya tidak memasukkan _id dan properti yang telah dibuat karena ini akan diisi melalui code, Bagaimanapun, jika anda tidak memiliki field yang ingin anda keluarkan, metode dinamis akan bekerja dengan baik.

Membuat template CSV

Dengan array dari field yang dijelaskan, saya menggunakan paketjson2csv untuk membuat CSV template sendiri dari objek Javascript milik saya. Objek csv ini akan menjadi hasil dari rute ini.

Dan akhirnya, menggunakan properti res server ekspres, Saya menyiapkan 2 properti header yang akan memaksa pengunduhan dari file authors.csv.

Dalam hal ini, jika anda menjalankan aplikasi simpul anda dan menavigasikan ke http://localhost dalam web browser anda, formulir werb akan ditampilkan dengan sebuah tautan untuk mengunduh template. Meng-klik link tautan untuk mengunduh template akan memungkinkan anda untuk mengunduh file authors.csv untuk diisi sebelum diunggah.

Berikut merupakan contoh dari file CSV yang diisi:

Contoh ini, saat diunggah, akan membuat 2 author: diri saya sendiri dan seorang teman yang menulis sebuah buku di Node.js beberapa tahun yang lalu. Anda mungkin memperhatikan kalau di akhir masing-masing baris adalah 3 buah koma ",,,". Hal ini dilakukan untuk menyingkat contohnya. Saya belum mengisi properti social network (twitterfacebook, dan linkedin).

Potongan puzzle mulai kembali Potongan-potongan puzzle mulai bersatu dan membentuk sebuah gambar. Mari kita lihat daging dan kentang dari contoh ini dan menguraikan file CSV tersebut. The File index.js membutuhkan beberapa pembaharuan untuk menghubungkan ke MongoDB dan membuat sebuah rute POST bru yang akan menerima file upload:

Dengan sebuah koneksi database dan sebuah rute POST baru yang dikonfigurasi, waktunya untuk mem-parsing file CSV. Untungnya ada beberapa library hebat yang membantu pekerjaan ini. Saya sudah memilih untuk menggunakan paket fast-csv yang akan dipasang dengan perinah sebagai berikut:

Rute POST dibuat menyerupai rute template yang meminta fungsi post dari file upload.js. Tidak perlu menempatkan fungsi ini ke file yang terpisah; bagaimanapun, saya ingin membuat file terpisah untuk rute-rute ini karena menjaga code tetap bagus dan teratur.

Mengirimkan Data

Dan akhirnya, mari kita buat file upload.js yang berisi fungsi post yang akan dipanggi; saat form yang telah dibuat sebelumnya disubmit:

Cukup banyak yang terjadi dalam file ini. Tiga baris pertama termasuk package yang dibutuhkan yang akan diperlukan untuk menguraikan dan menyimpan data CSV.

Selanjutnya, fungsi post dijelaskan dan diekspor untuk digunakan oleh file index.js. Dalam fungsi ini adalah tempat dimana keajaiban terjadi.

Fungsi ini pertama - tama memeriksa jika disana terdapat file di dalam request body. Jika tidak ada, sebuah error akan direturn mengindikasikan sebuah file harus diunggah.

Saat sebuah file telah diunggah, sebuah referensi ke file disimpan utnuk memanggil variabel authorFile. Hal ini dilakukan dengan mengakses array files dan properti file di dalam array. Properti file cocok dengan nama dari nama file input yang saya jelaskan di awal dalam contoh index.html.

Saya juga sudah membuat array author yang akan diisi saat file CSV diuraikan. Array ini akan digunakan untuk menyimpan data ke dalam database.

Library fast-csv sekarang dipanggil dengan memanfaatkan fungsi fromString. Fungsi ini menerima file CSV sebagai sebuah string. Saya telah mengekstrak string dari properti authorFile.data Properti data berisi konten file CSV yang saya unggah.

Saya telah memasukkan 2 opsi untuk fungsi fast-csv : headers dan ignoreEmpty. Keduanya diset ke true. Mmeberitahu library kalau baris pertama dari file CSV akan terdiri dari header-header dan mengosongkan baris yang harus diabaikan.

Dengan opsi yang dikonfigurasi, Saya sudah menyiapkan 2 fungsi listener yang akan dipanggil ketika event data dan ebent end dicetuskan. Event data event dipanggil sekali untuk setiap baris file CSV. Event ini berisi objek JavaScript dari data yang diuraikan.

Saya memperbarui objek ini untuk memasukkan properti_id dari Skema Author dengan ObjectId baru. Objek ini kemudian ditambahkan ke array authors.

Ketika file CSV telah sepenuhnya diurai, event end aka dipicu. Dalam fungsi callback, saya memanggil create fungsi create pada model author, menguraikain array authors ke dalamnya.

Jika terjadi error mencoba menyimpan array, exception dilemparkan; jika tidak, pesan sukses ditampilkan kepada pengguna yang menunjukkan berapa banyak penulis yang telah diunggah dan disimpan ke database.

Jika anda ingin melihat source code secara lengkap, saya telah membuat tempat penyimpaan GitHub dengan isi code.

Kesimpulan

Dalam contoh saya, saya hanya mengunggah beberapa record. Jika kasus penggunaan Anda membutuhkan kemampuan untuk mengunggah ribuan record, mungkin ada baiknya menyimpan record dalam potongan yang lebih kecil.

Ini bisa dilakukan dengan beberapa cara. Jika saya menerapkannya, saya akan menyarankan memperbarui fungsi call back data utnuk ememriksa panjang array author. Ketika array melebihi panjang yang Anda tetapkan, sontoh 100, panggil fungsi Author.createpada array, dankemudian reset array ke empty. Kemudian ini akan menyimpan record dalam potongan 100. Patikan untuk meninggalkan panggilan akhir create did alam fungsi callback end untuk menyimpaan record akhir.

Selamat menikmati!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.