การดึงรายชื่อ MongoDB Databases เป็น JavaScript Array
ใช้ db.runCommand({listDatabases: 1}) บน Database admin เพื่อดึงข้อมูล Database ทั้งหมด แล้ว Map เฉพาะชื่อมาเป็น Array
ขั้นตอนการทำงาน
- Switch ไป Database
admin - รัน
listDatabasesCommand - Extract เฉพาะชื่อ Database มาเป็น Array
ตัวอย่างคำสั่ง
> use admin;
switched to db admin
> allDatabasesDetails = db.runCommand({listDatabases: 1});
ผลลัพธ์ (Full Response):
{
"databases" : [
{ "name" : "admin", "sizeOnDisk" : 847872, "empty" : false },
{ "name" : "config", "sizeOnDisk" : 98304, "empty" : false },
{ "name" : "local", "sizeOnDisk" : 73728, "empty" : false },
{ "name" : "sample", "sizeOnDisk" : 1273856, "empty" : false },
{ "name" : "sampleDemo", "sizeOnDisk" : 352256, "empty" : false },
{ "name" : "studentSearch", "sizeOnDisk" : 262144, "empty" : false },
{ "name" : "test", "sizeOnDisk" : 9527296, "empty" : false }
],
"totalSize" : 12435456,
"ok" : 1
}
Extract เฉพาะชื่อ Database เป็น Array
> allDatabaseName = [];
[ ]
> for (var j in allDatabasesDetails.databases) {
allDatabaseName.push(allDatabasesDetails.databases[j].name);
}
ผลลัพธ์ (จำนวน Database):
7
ตรวจสอบ Array ที่ได้
> allDatabaseName;
[ "admin", "config", "local", "sample", "sampleDemo", "studentSearch", "test" ]
วิธีที่สั้นกว่า (Modern JavaScript / MongoDB 4.4+)
> allDatabaseName = db.runCommand({listDatabases: 1}).databases.map(db => db.name);
[ "admin", "config", "local", "sample", "sampleDemo", "studentSearch", "test" ]
การใช้งาน Array นี้
// ตรวจสอบ Database มีอยู่
> allDatabaseName.includes("test");
true
// วน Loop ทำงานกับแต่ละ Database
> allDatabaseName.forEach(function(dbName) {
if (dbName !== "admin" && dbName !== "local" && dbName !== "config") {
print("Processing user database: " + dbName);
// db.getSiblingDB(dbName).collection.find()...
}
});
// Filter เฉพาะ User Databases (exclude system)
> var userDbs = allDatabaseName.filter(function(name) {
return !["admin", "config", "local"].includes(name);
});
> userDbs;
[ "sample", "sampleDemo", "studentSearch", "test" ]
คำอธิบาย listDatabases Command
- ต้องรันบน admin Database เท่านั้น
- name : ชื่อ Database
- sizeOnDisk : ขนาดบนดิสก์ (Bytes)
- empty : true ถ้าไม่มี Collection (หรือไม่มีข้อมูล)
- totalSize : ขนาดรวมทั้งหมด
ตัวอย่าง Script ครบถ้วน
// Get all database names as array
function getAllDatabaseNames() {
var adminDB = db.getSiblingDB("admin");
var result = adminDB.runCommand({ listDatabases: 1, nameOnly: true });
// nameOnly: true (MongoDB 4.0+) คืนเฉพาะชื่อ ไม่ต้อง map
return result.databases.map(function(d) { return d.name; });
}
var allDbs = getAllDatabaseNames();
print("All databases: " + allDbs.join(", "));
หมายเหตุ
nameOnly: true(MongoDB 4.0+) ทำให้เร็วกว่าและ Response เล็กกว่า- System Databases:
admin,config(Sharded Cluster),local(Replica Set Oplog) - ใน Application ใช้ Driver Method:
client.db().admin().listDatabases()