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

หาขนาด (Size) ของเอกสารทั้งหมดใน Query Result ของ MongoDB

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