Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

วิธีดึงรายชื่อ MongoDB Databases เป็น JavaScript Array

การดึงรายชื่อ MongoDB Databases เป็น JavaScript Array

ใช้ db.runCommand({listDatabases: 1}) บน Database admin เพื่อดึงข้อมูล Database ทั้งหมด แล้ว Map เฉพาะชื่อมาเป็น Array

ขั้นตอนการทำงาน

  1. Switch ไป Database admin
  2. รัน listDatabases Command
  3. 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()