MongoDB ไม่มีคำสั่ง Built-in สำหรับหา Size รวมของหลายเอกสาร ต้องใช้ Loop ผ่าน Cursor และ Object.bsonsize() เพื่อคำนวณขนาด BSON ของแต่ละเอกสารแล้วรวมกัน
สร้างคอลเลกชันและข้อมูลตัวอย่าง
> db.sizeOfAllDocumentsDemo.insertOne({"StudentFirstName":"John","StudentSubject":["MongoDB","Java"]});
{ "acknowledged": true, "insertedId": ObjectId("5cd3c0c1edc6604c74817cd7") }
> db.sizeOfAllDocumentsDemo.insertOne({"StudentFirstName":"Larry","StudentSubject":["MySQL","PHP"],"StudentAge":21});
{ "acknowledged": true, "insertedId": ObjectId("5cd3c0d9edc6604c74817cd8") }
> db.sizeOfAllDocumentsDemo.insertOne({"StudentFirstName":"Chris","StudentSubject":["SQL Server","C#"],"StudentAge":23,"StudentCountryName":"US"});
{ "acknowledged": true, "insertedId": ObjectId("5cd3c0fbedc6604c74817cd9") }
แสดงข้อมูลทั้งหมด
> db.sizeOfAllDocumentsDemo.find().pretty();
ผลลัพธ์: 3 เอกสาร ขนาดต่างกันตามจำนวนฟิลด์
คำสั่ง: Loop คำนวณ Size รวม
> var allDocument = db.sizeOfAllDocumentsDemo.find();
> var counter = 0;
> allDocument.forEach(
function(myDocument) {
counter = counter + Object.bsonsize(myDocument);
}
);
> print(counter);
ผลลัพธ์:
358
คำอธิบาย
Object.bsonsize(document)คืนขนาด BSON ของ Document (Bytes) รวม _id และทุกฟิลด์forEach()วนลูปผ่าน Cursor ทุก Document- ผลลัพธ์ 358 Bytes = ขนาดรวมของ 3 เอกสาร
วิธีอื่น: ใช้ Aggregation (MongoDB 4.4+)
db.sizeOfAllDocumentsDemo.aggregate([
{$project: {size: {$bsonSize: "$$ROOT"}}},
{$group: {_id: null, totalSize: {$sum: "$size"}}}
]);
$bsonSize คืนขนาด BSON ของ Document (เหมือน Object.bsonsize)
ข้อควรระวัง
Object.bsonsize()ทำงานฝั่ง Client (Shell) ต้อง Fetch Document ทั้งหมดมาก่อน- Aggregation
$bsonSizeทำงานฝั่ง Server มีประสิทธิภาพมากกว่าสำหรับข้อมูลเยอะ - ขนาด BSON ≠ ขนาดบน Disk (มี Compression, Padding, Index)
- ใช้
db.collection.stats()หรือdb.collection.dataSize()สำหรับสถิติ Collection ทั้งหมด
คำสั่งสถิติ Collection
-
-
-
-