Apakah Mongoose v3.6 + mendukung penyisipan batch sekarang? Saya telah mencari selama beberapa menit tetapi apa pun yang cocok dengan kueri ini berumur beberapa tahun dan jawabannya jelas tidak.
Edit:
Untuk referensi di masa mendatang, jawabannya adalah dengan menggunakan Model.create()
. create()
menerima larik sebagai argumen pertamanya, jadi Anda bisa meneruskan dokumen Anda untuk disisipkan sebagai larik.
Jawaban:
Model.create () vs Model.collection.insert (): pendekatan yang lebih cepat
Model.create()
adalah cara yang buruk untuk melakukan penyisipan jika Anda berurusan dengan massal yang sangat besar. Ini akan sangat lambat . Dalam hal ini Anda harus menggunakanModel.collection.insert
, yang kinerjanya jauh lebih baik . Bergantung pada ukuran massal,Model.create()
bahkan akan crash! Mencoba dengan sejuta dokumen, tidak berhasil. MenggunakannyaModel.collection.insert
hanya butuh beberapa detik.docs
adalah larik dokumen yang akan disisipkan;options
adalah objek konfigurasi opsional - lihat dokumencallback(err, docs)
akan dipanggil setelah semua dokumen disimpan atau terjadi kesalahan. Jika berhasil, dokumen adalah kumpulan dokumen yang ada.Seperti yang ditunjukkan oleh penulis Mongoose di sini , metode ini akan melewati semua prosedur validasi dan mengakses driver Mongo secara langsung. Ini adalah trade-off yang harus Anda lakukan karena Anda menangani data dalam jumlah besar, jika tidak, Anda tidak akan dapat memasukkannya ke database Anda sama sekali (ingat, kita membicarakan ratusan ribu dokumen di sini).
Contoh sederhana
Perbarui 2019-06-22 : meskipun
insert()
masih dapat digunakan dengan baik, itu sudah usang dan mendukunginsertMany()
. Parameternya persis sama, jadi Anda bisa menggunakannya sebagai pengganti drop-in dan semuanya akan berfungsi dengan baik (yah, nilai kembaliannya sedikit berbeda, tetapi Anda mungkin tidak menggunakannya).Referensi
sumber
Model.collection
langsung melewati driver Mongo, Anda kehilangan semua barang luwak yang rapi termasuk validasi dan kait. Hanya sesuatu yang perlu diingat.Model.create
kehilangan pengait, tetapi masih melalui validasi. Jika Anda menginginkan semuanya, Anda harus mengulang dannew MyModel()
Mongoose 4.4.0 sekarang mendukung penyisipan massal
Mongoose 4.4.0 memperkenalkan --true-- penyisipan massal dengan metode model
.insertMany()
. Ini jauh lebih cepat daripada mengulang.create()
atau menyediakannya dengan array.Pemakaian:
Atau
Anda dapat melacaknya di:
sumber
bulkWrite
? Lihat di sini: stackoverflow.com/questions/38742475/…fatal error allocation failed
. Tetapi jika saya menggunakan collection.insert, itu berfungsi dengan sempurna.dateCreated : { type: Date, default: Date.now },
Memang, Anda dapat menggunakan metode "create" dari Mongoose, ini dapat berisi berbagai dokumen, lihat contoh ini:
Fungsi panggilan balik berisi dokumen yang disisipkan. Anda tidak selalu tahu berapa banyak item yang harus dimasukkan (argumen tetap panjang seperti di atas) sehingga Anda dapat mengulanginya:
Pembaruan: Solusi yang lebih baik
Solusi yang lebih baik akan digunakan
Candy.collection.insert()
daripadaCandy.create()
- digunakan dalam contoh di atas - karena lebih cepat (create()
memanggilModel.save()
setiap item jadi lebih lambat).Lihat dokumentasi Mongo untuk informasi lebih lanjut: http://docs.mongodb.org/manual/reference/method/db.collection.insert/
(terima kasih kepada arcseldon karena menunjukkan hal ini)
sumber
{type:'jellybean'}
bukan{type:'jelly bean'}
? Btw. tipe aneh apa itu? Apakah mereka bagian dari Mongoose API?type
biasanya disediakan dalam bahasa Mongoose untuk denominasi ADT dari objek database.Anda dapat melakukan penyisipan massal menggunakan mongoDB shell menggunakan memasukkan nilai-nilai dalam array.
sumber
YourModel.collection.insert()
collection.insert
jawaban mentah diberikan beberapa minggu sebelum jawaban ini, dan dijelaskan dengan lebih rinci.Anda dapat melakukan penyisipan massal menggunakan luwak, sebagai jawaban skor tertinggi. Tetapi contoh tidak dapat bekerja, seharusnya:
Jangan gunakan contoh skema untuk penyisipan massal, Anda harus menggunakan objek peta biasa.
sumber
Berikut adalah kedua cara menyimpan data dengan insertMany dan save
1) Mongoose menyimpan berbagai dokumen
insertMany
secara massal2) Mongoose menyimpan berbagai dokumen dengan
.save()
Dokumen-dokumen ini akan menyimpan paralel.
sumber
Tampaknya menggunakan luwak ada batasan lebih dari 1000 dokumen, saat menggunakan
Kamu bisa memakai:
Tetapi ini hampir dua kali lebih cepat saat menguji dengan 10.000 dokumen:
sumber
Berbagi kode yang berfungsi dan relevan dari proyek kami:
sumber
.insertMany
solusi sudah diberikan (dan menjelaskan) dalam 2016 jawabannya .