Saya sedang mempersiapkan skrip pembuatan database di Node.js dan Mongoose. Bagaimana cara memeriksa apakah database sudah ada, dan jika demikian, hapus (hapus) menggunakan Mongoose?
Saya tidak dapat menemukan cara untuk menjatuhkannya dengan luwak.
Jawaban:
Tidak ada metode untuk membuang koleksi dari luwak, hal terbaik yang dapat Anda lakukan adalah menghapus salah satu konten:
Tetapi ada cara untuk mengakses driver javascript asli mongodb, yang dapat digunakan untuk ini
Peringatan
Buat cadangan sebelum mencoba ini jika terjadi kesalahan!
sumber
Mongoose akan membuat database jika belum ada pada koneksi, jadi setelah Anda membuat koneksi, Anda bisa menanyakannya untuk melihat apakah ada sesuatu di dalamnya.
Anda dapat menjatuhkan database apa pun yang Anda sambungkan:
sumber
mongoose.connection.db.dropDatabase()
tetapi saya menemukan db masih ada? Apakah saya melewatkan sesuatu?dropDatabase
pemanggilan harus ditempatkan di callbackconnect
, sebagaimongoose.connect('...', function() { ...dropDatabase()})
.mongoose.connection.db.executeDbCommand( {dropDatabase:1}, function(err, result) { if (err) { console.log(err); } done(); });
Jika Anda memodifikasi solusi @ hellslam seperti ini, maka itu akan berhasil
Saya menggunakan teknik ini untuk menjatuhkan Database setelah tes integrasi saya
Setidaknya HTH itu untuk saya, jadi saya memutuskan untuk berbagi =)
sumber
db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);
mongoose.connect
sebenarnya kembalimongoose
. Alih-alihconn = mongoose.connect(...)
saya akan menulismongoose.connect(...)
dan kemudianconn = mongooose.connection
.connect
asynchronous. Jadi jika koneksi tidak segera terjadi, perintah dropDatabase () akan gagal. Itulah mengapa solusi lain di atas merekomendasikan untuk meletakkandropDatabase
perintah di callback keconnect
pernyataan atauopen
penanganan peristiwa.Mencoba jawaban @ hellslam dan @ silverfighter. Saya menemukan kondisi balapan yang menahan tes saya. Dalam kasus saya, saya menjalankan tes mocha dan dalam fungsi tes sebelumnya saya ingin menghapus seluruh DB. Inilah yang berhasil untuk saya.
Anda dapat membaca lebih lanjut https://github.com/Automattic/mongoose/issues/1469
sumber
Jawaban yang diperbarui, untuk 4.6.0+, jika Anda memiliki preferensi untuk promise ( lihat dokumen ):
Saya menguji kode ini dalam kode saya sendiri, menggunakan luwak 4.13.6. Juga, perhatikan penggunaan
useMongoClient
opsi ( lihat dokumen ). Dokumen menunjukkan:sumber
Kesulitan yang saya alami dengan solusi lain adalah mereka mengandalkan memulai ulang aplikasi Anda jika Anda ingin indeks berfungsi kembali.
Untuk kebutuhan saya (yaitu dapat menjalankan pengujian unit pada nukes semua koleksi, kemudian membuatnya kembali bersama dengan indeksnya), saya akhirnya menerapkan solusi ini:
Ini bergantung pada pustaka underscore.js dan async.js untuk mengumpulkan indeks dalam parellel, itu bisa dibatalkan jika Anda menentang pustaka itu tetapi saya membiarkannya sebagai latihan untuk pengembang.
sumber
Untuk mengosongkan koleksi tertentu dalam database:
catatan:
sumber
Ini bekerja untuk saya pada Mongoose
v4.7.0
:sumber
Cara terbaik untuk meletakkan database Anda di Mongoose bergantung pada versi Mongoose yang Anda gunakan. Jika Anda menggunakan versi Mongoose 4.6.4 atau yang lebih baru, maka metode yang ditambahkan dalam rilis tersebut kemungkinan akan berfungsi dengan baik untuk Anda:
Dalam rilis yang lebih lama, metode ini tidak ada. Sebagai gantinya, Anda akan menggunakan panggilan MongoDB langsung:
Namun, jika ini dijalankan tepat setelah koneksi database dibuat, itu mungkin bisa gagal secara diam-diam. Ini terkait dengan koneksi yang sebenarnya asynchronous dan belum diatur ketika perintah terjadi. Ini biasanya tidak menjadi masalah untuk panggilan Mongoose lainnya seperti
.find()
, yang mengantri sampai koneksi terbuka dan kemudian dijalankan.Jika Anda melihat kode sumber untuk
dropDatabase()
pintasan yang ditambahkan, Anda dapat melihat bahwa itu dirancang untuk menyelesaikan masalah ini dengan tepat. Ia memeriksa untuk melihat apakah koneksi terbuka dan siap. Jika demikian, itu akan segera mengaktifkan perintah. Jika tidak, ini mendaftarkan perintah untuk dijalankan ketika koneksi database telah dibuka.Beberapa saran di atas merekomendasikan untuk selalu meletakkan
dropDatabase
perintah Anda diopen
handler. Tapi itu hanya berfungsi jika koneksi belum terbuka.Berikut adalah versi sederhana dari logika di atas yang dapat digunakan dengan versi Mongoose sebelumnya:
sumber
Luwak 4.6.0+:
Meneruskan panggilan balik untuk terhubung tidak akan berfungsi lagi:
TypeError: Tidak dapat membaca properti 'commandsTakeWriteConcern' dari null
sumber
connect
mengembalikan janji, sehingga Anda dapat menambahkan.then((connection) => { ... });
kemongoose.connect
. Lihat: mongoosejs.com/docs/connections.htmlsumber
Karena metode penghapusan disusutkan di perpustakaan luwak, kita dapat menggunakan fungsi deleteMany tanpa parameter yang dilewatkan.
Ini akan menghapus semua konten Model khusus ini dan koleksi Anda akan kosong.
sumber
Untuk meletakkan semua dokumen dalam koleksi:
Jawaban ini didasarkan dari file index.d.ts luwak:
sumber
Untuk menjatuhkan semua dokumen dalam koleksi:
seperti yang terlihat dalam tes
sumber