Hapus semua yang ada di database MongoDB

454

Saya sedang melakukan pengembangan di MongoDB. Untuk tujuan yang sama sekali tidak jahat, kadang-kadang saya ingin membuang segala sesuatu dalam basis data — yaitu, untuk menghapus setiap koleksi, dan apa pun yang ada di sekitar, dan mulai dari awal. Apakah ada satu baris kode yang akan membiarkan saya melakukan ini? Poin bonus untuk memberikan metode konsol MongoDB dan metode driver MongoDB Ruby.

Trevor Burnham
sumber

Jawaban:

588

Dalam mongo shell:

use [database];
db.dropDatabase();

Dan untuk menghapus pengguna:

db.dropAllUsers();
Josh K.
sumber
23
@connorbode Terima kasih untuk ini. Saya sudah membacanya dan segera: "T-Tapi OP tidak ingin menghapus database!" . Perintah yang sangat menyesatkan !!
Henrique Miranda
Gunakan dengan hati-hati: jika Anda berada di lingkungan yang terguncang menggunakan wiredTiger dan Anda tidak memiliki basis data pengguna dan Anda memanggil dropDatabase, basis data akan dihapus dan dapat muncul kembali sebagai yang utama pada beling yang berbeda ketika catatan baru ditambahkan.
Jason R. Coombs
2
Ini tidak akan menghapus pengguna yang dilampirkan ke database terkait. Jadi, Anda mungkin ingin menghapusnya secara manual. db.dropAllUsers();
Fırat KÜÇÜK
2
Perhatikan bahwa basis data tidak akan ditampilkan setelah menggunakan perintah "use dbs". Namun, itu ada di sana. Jadi, jangan khawatir.
wynshaft
@StepanYakovenko Mungkin perlu mengautentikasi dengan instance MongoDB
Josh K
114

Juga, dari baris perintah:

mongo DATABASE_NAME --eval "db.dropDatabase();"
Rimian
sumber
5
Saya tidak percaya ini bekerja di 2.4.6. Catatan saya masih ada.
Brandon Clark
Apakah ini akan membuat para pengguna jauh dari basis data juga?
Gert van den Berg
67

Saya memiliki masalah yang sama, ketika saya perlu mengatur ulang semua koleksi tetapi tidak ingin kehilangan pengguna basis data. Gunakan baris kode berikut, jika Anda ingin menyimpan konfigurasi pengguna untuk database:

use <whichever database>
db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db[c].drop(); })

Kode ini akan melewati semua nama koleksi dari satu database dan menjatuhkan yang tidak dimulai dengan "sistem.".

Gering
sumber
2
Seperti yang disebutkan oleh @DanH, Anda mungkin merasa lebih dapat diandalkan untuk removemenggantikannya drop. The removepilihan muncul untuk mempertahankan kendala pada bidang koleksi yang Anda kliring. Ketika kami menggunakan dropmetode ini, uniquekendala pada salah satu bidang kami tidak dihormati setelah jatuhnya.
Scottymac
@Scottymac - lebih baik lagi, menambahkan elsecabang (ke if (c.indexOf("system.") == -1)) yang tidak removebukan drop. Dengan begitu, Anda tidak lagi memiliki koleksi kosong jika tidak menggunakannya lagi
Bogdan D
1
Lebih baik daripada db[c], gunakan db.getCollection(c)yang menghindari kesalahan ketika nama koleksi adalah digit .
Jason R. Coombs
1
Menurut dokumen , sejak MongoDB 2.6, perintah dropDatabase tidak akan menghapus pengguna, jadi jawaban yang diterima mungkin lebih disukai.
Jason R. Coombs
1
Jika nama koleksi adalah angka, maka ini akan berfungsi sebagai gantinya:db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
Constantin Galbenu
35

Saya mengikuti db.dropDatabase()rute untuk waktu yang lama, namun jika Anda mencoba menggunakan ini untuk menghapus database di sela-sela kasus pengujian, Anda mungkin pada akhirnya akan menemukan masalah dengan kendala indeks yang tidak dihargai setelah penurunan database. Akibatnya, Anda harus mengotak-atikIndeksIndeks, atau rute yang lebih sederhana akan menghindari dropDatabase sama sekali dan hanya menghapus dari setiap koleksi dalam satu lingkaran seperti:

db.getCollectionNames().forEach(
  function(collection_name) {
    db[collection_name].remove()
  }
);

Dalam kasus saya, saya menjalankan ini dari command-line menggunakan:

mongo [database] --eval "db.getCollectionNames().forEach(function(n){db[n].remove()});"
DanH
sumber
1
Terima kasih atas saran ini, kami menggunakan db[collection_name].drop()dan itu menunjukkan masalah yang sama seperti yang Anda jelaskan dengan db.dropDatabase()metode ini. Mengganti s/drop/remove/bekerja dengan sangat baik!
Scottymac
10
Saya menemukan bahwa remove()itu tidak berfungsi dengan baik pada MongoDB untuk Windows, dan sebaliknya saya perlu melakukan remove({})yang bekerja pada OSX dan Windows.
DanH
Terima kasih atas tipnya, kami menggunakan platform Linux, tetapi ini layak untuk ditinjau lebih jauh.
Scottymac
2
Saya melihat ada kesalahan untuk penghapusan - karena db [collection_name] .remove () tidak memiliki kueri! Jadi sebenarnya harus: db [collection_name] .remove ({})
JoelParke
16

Dengan mengkompilasi jawaban dari @Robse dan @DanH (kudos!), Saya mendapatkan solusi berikut yang sepenuhnya memuaskan saya:

db.getCollectionNames().forEach( function(collection_name) { 
  if (collection_name.indexOf("system.") == -1) 
       db[collection_name].drop();
  else  
       db.collection_name.remove({}); 
});

Hubungkan ke database Anda, jalankan kodenya.

Itu membersihkan database dengan menjatuhkan koleksi pengguna dan mengosongkan koleksi sistem.

Bogdan D
sumber
Script ini membersihkan semuanya hanya dalam satu database Mongo tertentu. Itu menghapus semua koleksi dalam database ini.
staskrak
10

Dengar beberapa menggunakan operasi hapus penuh untuk mongodb menggunakan mongo shell

Untuk menghapus dokumen tertentu dalam koleksi: db.mycollection.remove( {name:"stack"} )

Untuk menghapus semua dokumen dalam koleksi: db.mycollection.remove()

Untuk menghapus koleksi: db.mycollection.drop()

untuk menghapus database: pertama pergi ke database itu dengan use mydbperintah dan kemudian

db.dropDatabase()
bhv
sumber
8

Menggunakan

[databaseName]
db.Drop+databaseName();

drop collection 

use databaseName 
db.collectionName.drop();
Mohamed El Gamal
sumber
7

kalau-kalau Anda harus menghapus semuanya sekaligus: (jatuhkan semua basis data sekaligus)

mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'
sja
sumber
7
db.getCollectionNames().forEach(c=>db[c].drop())
Selvakumar Ponnusamy
sumber
5

jika Anda ingin menghapus hanya database dan sub-koleksi gunakan ini:

  • use <database name>;
  • db.dropDatabase();

jika Anda ingin menghapus semua database di mongo maka gunakan ini:

db.adminCommand("listDatabases").databases.forEach(function(d)
             {
              if(d.name!="admin" && d.name!="local" && d.name!="config")
                {
                 db.getSiblingDB(d.name).dropDatabase();
                }
             }
          );
Stéphane Bruckert
sumber
Jawaban yang bagus ... ini mungkin yang diinginkan pengguna
robert
1

Cara termudah untuk menghapus database katakanlah blog:

> use blog
switched to db blog
> db.dropDatabase();
{ "dropped" : "blog", "ok" : 1 }
Shalabh Raizada
sumber
1

Untuk pengembang Meteor.

  1. Buka jendela terminal kedua saat menjalankan aplikasi Anda localhost:3000.

  2. Dalam menjalankan folder proyek Anda meteor mongo,.

    coolName = new Mongo.Collection('yourCollectionName');

  3. Maka cukup masukkan db.yourCollectionName.drop();

  4. Anda akan secara otomatis melihat perubahan di server lokal Anda.

Untuk semua orang.

db.yourCollectionName.drop();

Felipe Alarcon
sumber
1
  1. Daftar semua dbs acara dbs tersedia
  2. Pilih penggunaan db yang diperlukan
  3. Jatuhkan basis data db.dropDatabase () // Beberapa perintah tambahan
  4. Daftar semua koleksi yang tersedia di koleksi acara db
  5. Hapus koleksi spesifikasi db.collection.drop ()

Semoga itu bisa membantu

priya raj
sumber
1

saya lebih memilih

db.your_collection.remove({})

lebih

db.your_collection.drop()

Jika koleksi Anda adalah koleksi khusus yaitu koleksi tertutup atau koleksi dengan satu bidang ditandai sebagai unik, menjatuhkan akan menghapus koleksi itu sendiri dan ketika koleksi dibuat lagi itu akan menjadi koleksi biasa. Anda harus mendefinisikan properti lagi. Jadi gunakan remove()untuk menghapus dokumen tanpa menghapus koleksi dan memengaruhi perilaku koleksi.

Sreeragh AR
sumber
1
Poin bagus. Perlu disebutkan, bahwa drop()itu hampir instan dan remove({})mengunci db Anda selama beberapa menit atau puluhan menit (tergantung pada ukuran koleksi).
Sergio Tulentsev
0

Untuk menghapus semua DB gunakan:

for i in $(mongo --quiet --host $HOSTNAME --eval "db.getMongo().getDBNames()" | tr "," " ");

do mongo $i --host $HOSTNAME --eval "db.dropDatabase()";

done 
Zaur
sumber
0
use <dbname>
db.dropAllUsers()
db.dropAllRoles()
db.dropDatabase()

Dokumentasi MongoDB db.dropDatabase () yang menjelaskan modifikasi yang diperkenalkan pada 2.6:

Berubah dalam versi 2.6: Perintah ini tidak menghapus pengguna yang terkait dengan database saat ini.

Antonio Bardazzi
sumber
0

Di MongoDB 3.2 dan yang lebih baru, Mongo().getDBNames()di mongoshell akan menampilkan daftar nama database di server:

> Mongo().getDBNames()
[ "local", "test", "test2", "test3" ]

> show dbs
local  0.000GB
test   0.000GB
test2  0.000GB
test3  0.000GB

Sebuah forEach()loop di atas array kemudian dapat memanggil dropDatabase()untuk menjatuhkan semua database yang terdaftar. Secara opsional, Anda dapat memilih untuk melewati beberapa database penting yang tidak ingin Anda hapus. Sebagai contoh:

Mongo().getDBNames().forEach(function(x) {
  // Loop through all database names
  if (['admin', 'config', 'local'].indexOf(x) < 0) {
    // Drop if database is not admin, config, or local
    Mongo().getDB(x).dropDatabase();
  }
})

Contoh dijalankan:

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
test2   0.000GB
test3   0.000GB

> Mongo().getDBNames().forEach(function(x) {
...   if (['admin', 'config', 'local'].indexOf(x) < 0) {
...     Mongo().getDB(x).dropDatabase();
...   }
... })

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
kevinadi
sumber