ลบทุกอย่างในฐานข้อมูล MongoDB


454

ฉันกำลังพัฒนา MongoDB เพื่อจุดประสงค์ที่ไม่ใช่ความชั่วโดยสิ้นเชิงบางครั้งฉันต้องการที่จะระเบิดทุกสิ่งในฐานข้อมูล - นั่นคือเพื่อลบคอลเลกชันทั้งหมดและสิ่งอื่นใดที่อาจวางอยู่รอบ ๆ และเริ่มต้นจากศูนย์ มีรหัสบรรทัดเดียวที่จะให้ฉันทำเช่นนี้? คะแนนโบนัสสำหรับการให้ทั้งวิธีคอนโซล MongoDB และวิธีการไดรเวอร์ MongoDB Ruby

คำตอบ:


588

ในเปลือก Mongo:

use [database];
db.dropDatabase();

และเพื่อลบผู้ใช้:

db.dropAllUsers();

23
@connorbode ขอบคุณสำหรับสิ่งนี้ ฉันอ่านแล้วและในทันที: "B-but OP ไม่ต้องการลบฐานข้อมูล!" . คำสั่งที่ทำให้เข้าใจผิดมาก !!
Henrique Miranda

ใช้ด้วยความระมัดระวัง: หากคุณอยู่ในสภาพแวดล้อมที่แตกหักโดยใช้ wiredTiger และคุณไม่มีฐานข้อมูลผู้ใช้และคุณเรียกใช้ฐานข้อมูล dropDatabase ฐานข้อมูลจะถูกลบและอาจปรากฏเป็นหลักในส่วนที่แตกต่างกันเมื่อเพิ่มระเบียนใหม่
Jason R. Coombs

2
การทำเช่นนี้จะไม่ลบผู้ใช้ที่เชื่อมต่อกับฐานข้อมูลที่เกี่ยวข้อง ดังนั้นคุณอาจต้องการลบด้วยตนเอง db.dropAllUsers();
FıratKÜÇÜK

2
โปรดทราบว่าฐานข้อมูลจะไม่แสดงหลังจากใช้คำสั่ง "use dbs" อย่างไรก็ตามมันอยู่ที่นั่น ดังนั้นไม่ต้องกังวล
wynshaft

@StepanYakovenko อาจจำเป็นต้องตรวจสอบสิทธิ์กับอินสแตนซ์ MongoDB
Josh K

114

นอกจากนี้จากบรรทัดคำสั่ง:

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

5
ฉันไม่เชื่อว่างานนี้ใน 2.4.6 บันทึกของฉันยังคงมีอยู่
Brandon Clark

รีโมตนี้จะทำให้ผู้ใช้บนฐานข้อมูลด้วยหรือไม่
Gert van den Berg

67

ฉันมีปัญหาเดียวกันเมื่อฉันต้องการรีเซ็ตคอลเลกชันทั้งหมด แต่ไม่ต้องการทำให้ผู้ใช้ฐานข้อมูลหลวม ใช้บรรทัดของรหัสต่อไปนี้หากคุณต้องการบันทึกการกำหนดค่าผู้ใช้สำหรับฐานข้อมูล:

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

รหัสนี้จะผ่านชื่อคอลเลกชันทั้งหมดจากฐานข้อมูลเดียวและวางชื่อที่ไม่ได้ขึ้นต้นด้วย "ระบบ"


2
ดังกล่าวโดย @DanH คุณอาจพบว่ามันน่าเชื่อถือมากขึ้นเพื่อใช้ในสถานที่ของremove ตัวเลือกจะปรากฏขึ้นเพื่อรักษาข้อ จำกัด ในเขตคอลเลกชันที่คุณเป็นสำนักหักบัญชี เมื่อเราใช้ วิธีนี้ข้อ จำกัด ในหนึ่งในสาขาของเราไม่ได้รับเกียรติหลังจากการลดลง dropremovedropunique
Scottymac

@Scottymac - ดีกว่ายังเพิ่มelseสาขา (ไปif (c.indexOf("system.") == -1)) ที่ไม่แทนremove dropด้วยวิธีนี้คุณจะไม่เหลือคอลเลกชันที่ว่างเปล่าหากคุณไม่ได้ใช้อีกต่อไป
Bogdan D

1
ดีกว่าdb[c]การใช้งานdb.getCollection(c)ที่หลีกเลี่ยงข้อผิดพลาดเมื่อชื่อคอลเลกชันนี้เป็นหลัก
Jason R. Coombs

1
ตามเอกสารตั้งแต่ MongoDB 2.6 คำสั่ง dropDatabase จะไม่ลบผู้ใช้ดังนั้นคำตอบที่ยอมรับอาจเป็นที่นิยมมากกว่า
Jason R. Coombs

1
หากชื่อคอลเลกชันเป็นตัวเลขก็ควรใช้แทน:db.getCollectionNames().forEach(function(c) { if (c.indexOf("system.") == -1) db.getCollection(c).drop(); })
Constantin Galbenu

35

ฉันติดตามdb.dropDatabase()เส้นทางมาเป็นเวลานาน แต่ถ้าคุณพยายามใช้สิ่งนี้เพื่อเช็ดฐานข้อมูลระหว่างกรณีทดสอบคุณอาจพบปัญหากับข้อ จำกัด ของดัชนีที่ไม่ได้รับเกียรติหลังจากปล่อยฐานข้อมูล ดังนั้นคุณจะต้องยุ่งเกี่ยวกับ sureIndexes หรือเส้นทางที่ง่ายกว่านั้นคือการหลีกเลี่ยง dropDatabase ทั้งหมดและเพียงแค่ลบออกจากแต่ละคอลเล็กชันในลูปเช่น:

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

ในกรณีของฉันฉันใช้สิ่งนี้จากบรรทัดคำสั่งโดยใช้:

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

1
ขอบคุณสำหรับคำแนะนำนี้เราใช้งานอยู่db[collection_name].drop()และมันก็แสดงปัญหาเดียวกันกับที่คุณอธิบายด้วยdb.dropDatabase()วิธีนี้ สลับการ s/drop/remove/ทำงานเก่ง!
Scottymac

10
ฉันพบว่าremove()ไม่สามารถใช้งานได้ดีกับ MongoDB สำหรับ Windows และฉันต้องการที่จะremove({})ทำงานบนทั้ง OSX และ Windows แทน
DanH

ขอบคุณสำหรับเคล็ดลับเราอยู่บนแพลตฟอร์ม Linux แต่สิ่งนี้คุ้มค่าที่จะดูต่อไปอีกเล็กน้อย
Scottymac

2
ฉันสังเกตเห็นข้อผิดพลาดสำหรับการลบ - เนื่องจาก db [collection_name] .remove () ไม่มีการสืบค้น! ดังนั้นจึงจำเป็นต้องเป็น: db [collection_name] .remove ({})
JoelParke

16

ด้วยการรวบรวมคำตอบจาก @Robse และ @DanH (รุ่งโรจน์!) ฉันมีวิธีแก้ไขปัญหาต่อไปนี้ซึ่งทำให้ฉันสมบูรณ์:

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

เชื่อมต่อกับฐานข้อมูลของคุณเรียกใช้รหัส

มันล้างฐานข้อมูลโดยการวางคอลเลกชันของผู้ใช้และการล้างคอลเลกชันของระบบ


สคริปต์นี้ล้างข้อมูลทุกอย่างภายในฐานข้อมูล Mongo เดียวเท่านั้น มันจะลบคอลเลกชันทั้งหมดในฐานข้อมูลนี้
staskrak

10

ฟังบ้างใช้การลบแบบเต็มสำหรับ mongodb โดยใช้ mongo shell

ในการลบเอกสารเฉพาะในคอลเล็กชัน: db.mycollection.remove( {name:"stack"} )

ในการลบเอกสารทั้งหมดในคอลเล็กชัน: db.mycollection.remove()

วิธีลบคอลเล็กชัน: db.mycollection.drop()

เพื่อลบฐานข้อมูล: ก่อนอื่นให้ไปที่ฐานข้อมูลตามuse mydbคำสั่งแล้ว

db.dropDatabase()


7

ในกรณีที่คุณต้องการทิ้งทุกอย่างพร้อมกัน: (วางฐานข้อมูลทั้งหมดในครั้งเดียว)

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


5

หากคุณต้องการลบเฉพาะฐานข้อมูลและกลุ่มย่อยให้ใช้สิ่งนี้:

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

ถ้าคุณต้องการลบฐานข้อมูลทั้งหมดใน mongo ให้ใช้สิ่งนี้:

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

คำตอบที่ดี ... นี่อาจเป็นสิ่งที่ผู้ใช้กำลังจะมาถึง
robert

1

วิธีที่ง่ายที่สุดในการลบฐานข้อมูลบอกว่าบล็อก:

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

1

สำหรับนักพัฒนาของ Meteor

  1. เปิดหน้าต่าง terminal localhost:3000ที่สองในขณะที่ใช้แอปของคุณ

  2. meteor mongoในโครงการของคุณโฟลเดอร์วิ่ง

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

  3. จากนั้นก็เข้าไป db.yourCollectionName.drop();

  4. คุณจะเห็นการเปลี่ยนแปลงในเซิร์ฟเวอร์ท้องถิ่นของคุณโดยอัตโนมัติ

สำหรับคนอื่น ๆ

db.yourCollectionName.drop();


1
  1. แสดงรายการ dbs ที่มีอยู่ทั้งหมดแสดง dbs
  2. เลือกการใช้ db ที่จำเป็น
  3. ดร็อปฐานข้อมูล db.dropDatabase () // ไม่กี่คำสั่งเพิ่มเติม
  4. รายการคอลเลกชันทั้งหมดที่มีอยู่ใน db แสดงคอลเลกชัน
  5. ลบการรวบรวมข้อมูลจำเพาะ db.collection.drop ()

หวังว่าจะช่วย


1

ฉันชอบ

db.your_collection.remove({})

เกิน

db.your_collection.drop()

หากคอลเลกชันของคุณเป็นคอลเลกชันพิเศษเช่นคอลเลกชันที่มีฝาปิดหรือคอลเลกชันที่มีช่องหนึ่งที่ทำเครื่องหมายว่าไม่ซ้ำกันการดรอปจะล้างคอลเลกชันของตัวเองและเมื่อคอลเลกชันถูกสร้างขึ้นอีกครั้ง คุณจะต้องกำหนดคุณสมบัติอีกครั้ง ดังนั้นใช้remove()เพื่อล้างเอกสารโดยไม่ลบการรวบรวมและส่งผลกระทบต่อพฤติกรรมของการรวบรวม


1
จุดที่ดี เป็นมูลค่าการกล่าวขวัญที่drop()ใกล้ทันทีและremove({})ล็อคฐานข้อมูลของคุณสำหรับนาทีหรือสิบนาที (ขึ้นอยู่กับขนาดของคอลเลกชัน)
Sergio Tulentsev

0

ในการลบ DBs ทั้งหมดให้ใช้:

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

MongoDB db.dropDatabase () เอกสารอธิบายการแก้ไขแนะนำใน 2.6:

เปลี่ยนเป็นเวอร์ชั่น 2.6: คำสั่งนี้จะไม่ลบผู้ใช้ที่เกี่ยวข้องกับฐานข้อมูลปัจจุบัน


0

ใน MongoDB 3.2 และใหม่กว่าMongo().getDBNames()ในmongoเชลล์จะแสดงรายการชื่อฐานข้อมูลในเซิร์ฟเวอร์:

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

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

forEach()ห่วงมากกว่าอาร์เรย์แล้วจะเรียกdropDatabase()ว่าจะลดลงทุกฐานข้อมูลที่ระบุไว้ คุณสามารถเลือกที่จะข้ามฐานข้อมูลสำคัญบางอย่างที่คุณไม่ต้องการทิ้ง ตัวอย่างเช่น:

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

ตัวอย่างการเรียกใช้:

> 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.