ใช้ getSiblingDB("admin") และ runCommand({ listDatabases: 1 }) เพื่อดึงรายชื่อ database ทั้งหมด แล้ววนลูปเข้าถึงแต่ละอัน
ขั้นตอนการทำงาน
1. สลับไป database admin และดึงรายชื่อ database
> switchDatabaseAdmin = db.getSiblingDB("admin");
> allDatabaseName = switchDatabaseAdmin.runCommand({ "listDatabases": 1 }).databases;
2. ผลลัพธ์: Array ของ Database Objects
[
{ "name" : "admin", "sizeOnDisk" : 495616, "empty" : false },
{ "name" : "config", "sizeOnDisk" : 98304, "empty" : false },
{ "name" : "local", "sizeOnDisk" : 73728, "empty" : false },
{ "name" : "sample", "sizeOnDisk" : 1335296, "empty" : false },
{ "name" : "sampleDemo", "sizeOnDisk" : 278528, "empty" : false },
{ "name" : "studentSearch", "sizeOnDisk" : 262144, "empty" : false },
{ "name" : "test", "sizeOnDisk" : 8724480, "empty" : false }
]
วนลูปเข้าถึงแต่ละ Database
allDatabaseName.forEach(function(dbInfo) {
var db = db.getSiblingDB(dbInfo.name);
// ทำงานกับ database นี้ได้แล้ว
print("Database: " + dbInfo.name);
print("Collections: " + db.getCollectionNames());
});
คำสั่งที่มีประโยชน์ภายใน Loop
db.getCollectionNames()- รายชื่อคอลเลกชันdb.stats()- สถิติ databasedb.runCommand({ dbStats: 1 })- สถิติรายละเอียดdb.getCollection(name).countDocuments()- นับเอกสารแต่ละคอลเลกชัน
กรณีใช้งาน
- Backup script ทุก database
- Health check / Monitoring
- Cleanup old databases
- Audit permissions
ข้อควรระวัง
- ต้องมีสิทธิ์ admin (role: userAdminAnyDatabase หรือ root)
- Database
admin,config,localเป็น system databases - Loop อาจช้าถ้ามี database เยอะ ขนาดใหญ่
สรุป
ใช้ db.getSiblingDB("admin").runCommand({ listDatabases: 1 }) เพื่อดึงรายชื่อ database ทั้งหมด แล้ววนลูปด้วย forEach และ getSiblingDB(name) เพื่อเข้าถึงแต่ละ database