MongoDB veritabanındaki her şeyi silme


454

MongoDB üzerinde geliştirme yapıyorum. Tamamen kötü olmayan amaçlar için, bazen bir veritabanındaki her şeyi havaya uçurmak istiyorum - yani her bir koleksiyonu silmek ve etrafta yatan her şeyi silmek ve sıfırdan başlamak istiyorum. Bunu yapmama izin verecek tek bir kod satırı var mı? Hem MongoDB konsol yöntemi hem de MongoDB Ruby sürücü yöntemi vermek için bonus puanlar.

Yanıtlar:


588

Mongo kabuğunda:

use [database];
db.dropDatabase();

Ve kullanıcıları kaldırmak için:

db.dropAllUsers();

23
@connorbode Bunun için teşekkürler. Ben okudum ve hemen: "B-Ama OP veritabanını kaldırmak istemiyor!" . Çok yanıltıcı komut !!
Henrique Miranda

Dikkatli kullanın: wiredTiger kullanarak gölgeli bir ortamdaysanız ve kullanıcı veritabanınız yoksa ve dropDatabase'i çağırırsanız, veritabanı silinir ve yeni kayıtlar eklendiğinde farklı bir kırıkta birincil olarak yeniden görünebilir.
Jason R. Coombs

2
Bu, ilgili veritabanına bağlı kullanıcıyı silmez. Bu yüzden manuel olarak silmek isteyebilirsiniz. db.dropAllUsers();
Fırat KÜÇÜK

2
"Use dbs" komutu kullanıldıktan sonra veritabanının gösterilmeyeceğini unutmayın. Ancak, orada. Yani endişelenme.
wynshaft

@StepanYakovenko MongoDB örneği ile kimlik doğrulaması yapmanız gerekiyor
Josh K

114

Ayrıca, komut satırından:

mongo DATABASE_NAME --eval "db.dropDatabase();"

5
Bunun 2.4.6'da işe yaradığına inanmıyorum. Kayıtlarım hala var.
Brandon Clark

Bu, veritabanındaki kullanıcıları da uzak tutacak mı?
Gert van den Berg

67

Tüm koleksiyonları sıfırlamak gerektiğinde, ancak herhangi bir veritabanı kullanıcısını kaybetmek istemediğimde aynı sorunu yaşadım. Veritabanı için kullanıcı yapılandırmasını kaydetmek istiyorsanız aşağıdaki kod satırını kullanın:

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

Bu kod, bir veritabanındaki tüm koleksiyon adlarından geçer ve "system" ile başlamayanları bırakır.


2
@ DanH tarafından belirtildiği gibi removeyerine kullanmak daha güvenilir bulabilirsiniz drop. Bu removeseçenek, temizlediğiniz koleksiyonların alanlarındaki kısıtlamaları korumaya yönelik olarak görünür. dropYöntemi kullandığımızda, uniquealanlarımızdan birindeki kısıtlama düşüşün ardından onurlandırılmadı.
Scottymac

@Scottymac - daha iyisi, bir ekleme else(için şube if (c.indexOf("system.") == -1)yapar) removeyerine drop. Bu şekilde artık kullanmıyorsanız boş koleksiyonlarla kalmazsınız
Bogdan D

1
Daha iyisi , koleksiyon adları rakam olduğunda hatalardan kaçınmak için db[c]kullanın . db.getCollection(c)
Jason R. Coombs

1
Dokümanlara göre , MongoDB 2.6'dan beri, bir dropDatabase komutu kullanıcıları silmez, bu nedenle kabul edilen cevap muhtemelen tercih edilir.
Jason R. Coombs

1
Koleksiyon adı sayısalsa, bunun yerine çalışması gerekir:db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
Constantin Galbenu

36

db.dropDatabase()Rotayı uzun süre izledim , ancak bunu test senaryoları arasında veritabanını silmek için kullanmaya çalışıyorsanız, sonunda veritabanı düştükten sonra onurlandırılmayacak dizin kısıtlamaları ile ilgili sorunlar bulabilirsiniz. Sonuç olarak, sureIndexes ile uğraşmanız gerekir, ya da daha basit bir yol dropDatabase'den tamamen kaçınır ve sadece bir döngüdeki her koleksiyondan kaldırılır:

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

Benim durumumda bunu kullanarak komut satırından çalıştırıyordum:

mongo [database] --eval "db.getCollectionNames().forEach(function(n){db[n].remove()});"

1
Bu öneri için teşekkür ederiz, kullanıyorduk db[collection_name].drop()ve db.dropDatabase()yöntemle açıkladığınız aynı sorunları sergiliyordu . Geçiş s/drop/remove/zekice çalıştı!
Scottymac

10
Bunun remove()Windows için MongoDB'de iyi çalışmadığını gördüm ve bunun yerine remove({})hem OSX hem de Windows'ta çalışanı yapmam gerekiyordu .
DanH

Bahşiş için teşekkürler, bir Linux platformundayız, ancak bu biraz daha araştırmaya değer.
Scottymac

2
Silme için bir hata fark ettim - db [koleksiyon_adı] .remove () bir sorgu yok çünkü! Yani aslında olması gerekenler: db [collection_name] .remove ({})
JoelParke

16

@Robse ve @DanH (kudos!) 'İn cevaplarını derleyerek, beni tamamen tatmin eden aşağıdaki çözümü buldum:

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

Veritabanınıza bağlanın, kodu çalıştırın.

Kullanıcı koleksiyonlarını bırakarak ve sistem koleksiyonlarını boşaltarak veritabanını temizler.


Bu komut dosyası yalnızca belirli bir Mongo veritabanındaki her şeyi temizler. Bu veritabanındaki tüm koleksiyonları siler.
staskrak

10

Duymak bazı mongo kabuk kullanarak mongodb için tam silme işlemleri kullanın

Koleksiyonlardaki belirli bir belgeyi silmek için: db.mycollection.remove( {name:"stack"} )

Koleksiyonlardaki tüm belgeleri silmek için: db.mycollection.remove()

Koleksiyonu silmek için: db.mycollection.drop()

veritabanını silmek için: önce use mydbkomutla bu veritabanına gidin ve sonra

db.dropDatabase()

8

kullanım

[databaseName]
db.Drop+databaseName();

drop collection 

use databaseName 
db.collectionName.drop();

7

her şeyi bir kerede bırakmanız gerekirse: (tüm veritabanlarını bir kerede bırakın)

mongo --quiet --eval 'db.getMongo().getDBNames().forEach(function(i){db.getSiblingDB(i).dropDatabase()})'


5

yalnızca bir veritabanını ve alt koleksiyonlarını silmek istiyorsanız bunu kullanın:

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

mongo'daki tüm veritabanlarını silmek istiyorsanız bunu kullanın:

db.adminCommand("listDatabases").databases.forEach(function(d)
             {
              if(d.name!="admin" && d.name!="local" && d.name!="config")
                {
                 db.getSiblingDB(d.name).dropDatabase();
                }
             }
          );

Harika cevap ... bu muhtemelen kullanıcının ne elde ettiği
robert

1

Bir veritabanını silmenin en basit yolu blog diyor:

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

1

Meteor geliştiricileri için.

  1. Uygulamanızı çalıştırırken ikinci bir terminal penceresi açın localhost:3000.

  2. Projenizin klasöründe çalıştırın meteor mongo.

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

  3. Sonra girin db.yourCollectionName.drop();

  4. Yerel sunucunuzdaki değişiklikleri otomatik olarak görürsünüz.

Diğer herkes için.

db.yourCollectionName.drop();


1
  1. Kullanılabilir tüm dbs listesini göster dbs
  2. Gerekli db kullanımını seçin
  3. Veritabanını bırakın db.dropDatabase () // Birkaç ek komut
  4. Bir db show koleksiyonundaki tüm koleksiyonları listele
  5. Bir özellik koleksiyonunu kaldırın db.collection.drop ()

umarım yardımcı olur


1

tercih ederim

db.your_collection.remove({})

bitmiş

db.your_collection.drop()

Koleksiyonunuz özel bir koleksiyonsa, yani sınırlı bir koleksiyon veya tek bir alanı benzersiz olarak işaretlenmiş bir koleksiyonsa, bırakma koleksiyonun kendisini temizler ve koleksiyon yeniden oluşturulduğunda sıradan bir koleksiyon olur. Özellikleri tekrar tanımlamanız gerekecektir. Bu nedenle remove(), koleksiyonu kaldırmadan ve koleksiyonun davranışını etkilemeden belgeleri temizlemek için kullanın .


1
Güzel nokta. Yine de, bu drop()anlamaya yakın ve remove({})db'nizi dakikalar veya onlarca dakika kilitler (koleksiyon boyutuna bağlı olarak).
Sergio Tulentsev

0

Tüm DB'leri silmek için şunu kullanın:

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

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

done 


0

MongoDB 3.2 ve daha yeni, in Mongo().getDBNames()içinde mongosunucudaki veritabanı adları kabuk irade çıkışı bir liste:

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

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

forEach()Sonra dizi üzerinde bir döngü dropDatabase()listelenen tüm veritabanlarını bırakmak için çağırabilir . İsteğe bağlı olarak, bırakmak istemediğiniz bazı önemli veritabanlarını atlamayı tercih edebilirsiniz. Örneğin:

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();
  }
})

Örnek çalışma:

> 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.