Xóa mọi thứ trong cơ sở dữ liệu MongoDB


454

Tôi đang phát triển trên MongoDB. Vì mục đích hoàn toàn không xấu xa, đôi khi tôi muốn thổi bay mọi thứ trong cơ sở dữ liệu, đó là xóa mọi bộ sưu tập và bất cứ thứ gì khác có thể nằm xung quanh và bắt đầu lại từ đầu. Có một dòng mã nào sẽ cho phép tôi làm điều này? Điểm thưởng cho việc cung cấp cả phương thức bảng điều khiển MongoDB và phương thức trình điều khiển MongoDB Ruby.

Câu trả lời:


588

Trong vỏ mongo:

use [database];
db.dropDatabase();

Và để loại bỏ người dùng:

db.dropAllUsers();

23
@connorbode Cảm ơn vì điều này. Tôi đã đọc nó và ngay lập tức: "B-Nhưng OP không muốn xóa cơ sở dữ liệu!" . Lệnh rất sai lệch !!
Henrique Miranda

Hãy thận trọng: nếu bạn đang ở trong môi trường bị phân mảnh bằng WiredTiger và bạn không có cơ sở dữ liệu người dùng và bạn gọi dropDatabase, cơ sở dữ liệu sẽ bị xóa và có thể xuất hiện lại dưới dạng chính trên một phân đoạn khác khi bản ghi mới được thêm vào.
Jason R. Coombs

2
Điều này sẽ không xóa người dùng được gắn vào cơ sở dữ liệu liên quan. Vì vậy, bạn có thể muốn xóa nó bằng tay. db.dropAllUsers();
Fırat KÜÇÜK

2
Lưu ý rằng cơ sở dữ liệu sẽ không hiển thị sau khi sử dụng lệnh "use dbs". Tuy nhiên, nó ở đó. Vì vậy, không phải lo lắng.
wynshaft

@StepanYakovenko Có lẽ cần phải xác thực với phiên bản MongoDB
Josh K

114

Ngoài ra, từ dòng lệnh:

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

5
Tôi không tin điều này hoạt động trong 2.4.6. Hồ sơ của tôi vẫn tồn tại.
Brandon Clark

Điều này sẽ từ xa người dùng trên cơ sở dữ liệu?
Gert van den Berg

67

Tôi gặp vấn đề tương tự, khi tôi cần thiết lập lại tất cả các bộ sưu tập nhưng không muốn mất bất kỳ người dùng cơ sở dữ liệu nào. Sử dụng dòng mã sau đây, nếu bạn muốn lưu cấu hình người dùng cho cơ sở dữ liệu:

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

Mã này sẽ đi qua tất cả các tên bộ sưu tập từ một cơ sở dữ liệu và loại bỏ các tên không bắt đầu bằng "hệ thống".


2
Như được đề cập bởi @DanH, bạn có thể thấy nó đáng tin cậy hơn để sử dụng removethay thế drop. Các removetùy chọn xuất hiện để duy trì những hạn chế trên các lĩnh vực của các bộ sưu tập mà bạn đang thanh toán bù trừ. Khi chúng tôi sử dụng dropphương thức này, uniqueràng buộc đối với một trong các trường của chúng tôi đã không được thực hiện sau khi thả.
Scottymac

@Scottymac - tốt hơn hết, hãy thêm một elsenhánh (vào if (c.indexOf("system.") == -1)) removethay thế drop. Bằng cách đó, bạn sẽ không còn các bộ sưu tập trống nếu bạn không sử dụng chúng nữa
Bogdan D

1
Tốt hơn là db[c]sử dụng db.getCollection(c)để tránh lỗi khi tên bộ sưu tập là chữ số .
Jason R. Coombs

1
Theo các tài liệu , kể từ MongoDB 2.6, lệnh dropDatabase sẽ không xóa người dùng, vì vậy câu trả lời được chấp nhận có lẽ là thích hợp hơn.
Jason R. Coombs

1
Nếu tên bộ sưu tập là số, thì cái này sẽ hoạt động thay thế:db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
Constantin Galbenu 8/12/2016

35

Tôi đã theo db.dropDatabase()lộ trình trong một thời gian dài, tuy nhiên nếu bạn đang cố gắng sử dụng điều này để xóa cơ sở dữ liệu ở giữa các trường hợp kiểm tra, cuối cùng bạn có thể thấy các vấn đề với các ràng buộc chỉ mục không được thực hiện sau khi cơ sở dữ liệu bị hủy. Do đó, bạn sẽ cần phải loay hoay với các đảm bảo, hoặc một tuyến đường đơn giản hơn sẽ tránh hoàn toàn dropDatabase và chỉ xóa khỏi mỗi bộ sưu tập trong một vòng lặp, chẳng hạn như:

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

Trong trường hợp của tôi, tôi đã chạy nó từ dòng lệnh bằng cách sử dụng:

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

1
Cảm ơn bạn đã gợi ý này, chúng tôi đã sử dụng db[collection_name].drop()và nó đã thể hiện những vấn đề tương tự như bạn đã mô tả với db.dropDatabase()phương pháp. Chuyển đổi công s/drop/remove/việc rực rỡ!
Scottymac

10
Tôi thấy rằng remove()nó không hoạt động tốt trên MongoDB cho Windows và thay vào đó tôi cần phải làm remove({})việc trên cả OSX và Windows.
DanH

Cảm ơn vì tiền boa, chúng tôi đang ở trên một nền tảng Linux, nhưng điều này đáng để xem xét thêm một chút.
Scottymac

2
Tôi nhận thấy một lỗi cho việc xóa - vì db [sưu tập tên] .remove () không có truy vấn! Vì vậy, nó thực sự cần phải là: db [sưu tập tên] .remove ({})
JoelParke

16

Bằng cách tổng hợp các câu trả lời từ @Robse và @DanH (kudos!), Tôi đã có giải pháp sau đây hoàn toàn thỏa mãn tôi:

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

Kết nối với cơ sở dữ liệu của bạn, chạy mã.

Nó làm sạch cơ sở dữ liệu bằng cách bỏ bộ sưu tập người dùng và làm trống bộ sưu tập hệ thống.


Kịch bản này làm sạch mọi thứ chỉ trong một cơ sở dữ liệu Mongo cụ thể. Nó xóa tất cả các bộ sưu tập trong cơ sở dữ liệu này.
staskrak

10

Nghe là một số sử dụng thao tác xóa hoàn toàn cho mongodb bằng cách sử dụng shell mongo

Để xóa tài liệu cụ thể trong bộ sưu tập: db.mycollection.remove( {name:"stack"} )

Để xóa tất cả các tài liệu trong bộ sưu tập: db.mycollection.remove()

Để xóa bộ sưu tập: db.mycollection.drop()

để xóa cơ sở dữ liệu: đầu tiên hãy vào cơ sở dữ liệu đó bằng use mydblệnh và sau đó

db.dropDatabase()

8

Sử dụng

[databaseName]
db.Drop+databaseName();

drop collection 

use databaseName 
db.collectionName.drop();

7

trong trường hợp bạn cần bỏ mọi thứ cùng một lúc: (bỏ tất cả cơ sở dữ liệu cùng một lúc)

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


5

nếu bạn muốn xóa chỉ một cơ sở dữ liệu và các bộ sưu tập phụ của nó sử dụng:

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

Nếu bạn muốn xóa tất cả các cơ sở dữ liệu trong mongo thì hãy sử dụng điều này:

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

Câu trả lời tuyệt vời ... đây có lẽ là những gì người dùng đã nhận được
robert

1

Cách đơn giản nhất để xóa cơ sở dữ liệu nói blog:

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

1

Dành cho các nhà phát triển sao băng.

  1. Mở cửa sổ terminal thứ hai trong khi chạy ứng dụng của bạn localhost:3000.

  2. Trong thư mục dự án của bạn chạy , meteor mongo.

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

  3. Sau đó chỉ cần nhập db.yourCollectionName.drop();

  4. Bạn sẽ tự động thấy những thay đổi trong máy chủ cục bộ của bạn.

Đối với mọi người khác.

db.yourCollectionName.drop();


1
  1. Liệt kê ra tất cả các dbs hiển thị dbs
  2. Chọn sử dụng db cần thiết
  3. Thả cơ sở dữ liệu db.dropDatabase () // Vài lệnh bổ sung
  4. Liệt kê tất cả các bộ sưu tập có sẵn trong bộ sưu tập chương trình db
  5. Xóa bộ sưu tập đặc tả db.collection.drop ()

Mong rằng sẽ giúp


1

tôi thích

db.your_collection.remove({})

kết thúc

db.your_collection.drop()

Nếu bộ sưu tập của bạn là một bộ sưu tập đặc biệt, tức là bộ sưu tập có giới hạn hoặc bộ sưu tập có một trường được đánh dấu là duy nhất, việc thả sẽ xóa chính bộ sưu tập đó và khi bộ sưu tập được tạo lại, nó sẽ là một bộ sưu tập thông thường. Bạn sẽ phải xác định lại các thuộc tính. Vì vậy, sử dụng remove()để xóa các tài liệu mà không loại bỏ bộ sưu tập và ảnh hưởng đến hành vi của bộ sưu tập.


1
Điểm tốt. Tuy nhiên, điều đáng nói drop()là gần như tức thời và remove({})khóa db của bạn trong vài phút hoặc hàng chục phút (tùy thuộc vào kích thước bộ sưu tập).
Sergio Tulentsev

0

Để xóa tất cả các DB sử dụng:

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

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

done 

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

Tài liệu MongoDB db.dropDatabase () giải thích sửa đổi được giới thiệu trong 2.6:

Thay đổi trong phiên bản 2.6: Lệnh này không xóa người dùng được liên kết với cơ sở dữ liệu hiện tại.


0

Trong MongoDB 3.2 trở lên, Mongo().getDBNames()trong mongoshell sẽ xuất ra một danh sách các tên cơ sở dữ liệu trong máy chủ:

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

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

Một forEach()vòng lặp trên mảng sau đó có thể gọi dropDatabase()để loại bỏ tất cả các cơ sở dữ liệu được liệt kê. Tùy chọn bạn có thể chọn bỏ qua một số cơ sở dữ liệu quan trọng mà bạn không muốn bỏ. Ví dụ:

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

Chạy ví dụ:

> 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.