Làm cách nào để lấy kích thước của một tài liệu trong Mongodb?


87

Tôi đã gặp phải một hành vi kỳ lạ của mongo và tôi muốn làm rõ nó một chút ...
Yêu cầu của tôi rất đơn giản như sau: Tôi muốn lấy kích thước của một tài liệu duy nhất trong bộ sưu tập. Tôi đã tìm thấy hai giải pháp khả thi:

  • Object.bsonsize - một số phương thức javascript sẽ trả về kích thước tính bằng byte
  • db.collection.stats () - nơi có dòng 'avgObjSize' tạo ra một số chế độ xem kích thước "tổng hợp" (trung bình) trên dữ liệu. Nó chỉ đơn giản là đại diện cho kích thước trung bình của một tài liệu.

  • Khi tôi tạo bộ sưu tập thử nghiệm chỉ với một tài liệu, cả hai hàm đều trả về các giá trị khác nhau. Làm thế nào là nó có thể?
    Nó có tồn tại một số phương pháp khác để lấy kích thước của một tài liệu mongo không?

Ở đây, tôi cung cấp một số mã mà tôi thực hiện thử nghiệm:

  1. Tôi đã tạo cơ sở dữ liệu mới 'kiểm tra' và nhập tài liệu đơn giản chỉ với một thuộc tính: type: "auto"

    db.test.insert({type:"auto"})
    
  2. đầu ra từ lệnh gọi hàm stats (): db.test.stats () :

    { 
      "ns" : "test.test",
      "count" : 1,
      "size" : 40,
      "avgObjSize" : 40,
      "storageSize" : 4096,
      "numExtents" : 1,
      "nindexes" : 1,
      "lastExtentSize" : 4096,
      "paddingFactor" : 1,
      "systemFlags" : 1,
      "userFlags" : 0,
      "totalIndexSize" : 8176,
      "indexSizes" : {
            "_id_" : 8176
    },
    "ok" : 1
    

    }

  3. đầu ra từ lệnh gọi hàm bsonsize: Object.bsonsize (db.test.find ({test: "auto"}))

    481
    

Câu trả lời:


179

Trong lần gọi trước Object.bsonsize(), Mongodb trả về kích thước của con trỏ chứ không phải của tài liệu.

Cách đúng là sử dụng lệnh này:

Object.bsonsize(db.test.findOne())

Với findOne(), bạn có thể xác định truy vấn của mình cho một tài liệu cụ thể:

Object.bsonsize(db.test.findOne({type:"auto"}))

Điều này sẽ trả về kích thước chính xác (tính bằng byte) của tài liệu cụ thể.


1
Làm cách nào để lấy kích thước của danh sách tài liệu với truy vấn?
leon

Nhưng tất nhiên mã này sẽ tìm nạp tài liệu trước khi tính toán kích thước.
Sercan Ozdemir

Đây không phải trả lại một kích thước goood: (... Nhưng điều này: stackoverflow.com/a/40993183/3933634
Liberateur

3
Làm cách nào để lấy Object.bsonsize, câu lệnh import hoặc bắt buộc là gì?
PARAMANANDA PRADHAN

7
Đối với bất kỳ ai khác đã bỏ lỡ nó, bạn phải sử dụng findOnethay thếfind
Sam

36

Tôi khuyên bạn nên sử dụng tập lệnh này để có được kích thước thực.

db.users.find().forEach(function(obj)
{
  var size = Object.bsonsize(obj);
  print('_id: '+obj._id+' || Size: '+size+'B -> '+Math.round(size/(1024))+'KB -> '+Math.round(size/(1024*1024))+'MB (max 16MB)');
});

Lưu ý: Nếu ID của bạn là số nguyên 64 bit, phần trên sẽ cắt bớt giá trị ID khi in! Nếu đúng như vậy, bạn có thể sử dụng:

db.users.find().forEach(function(obj)
{
  var size = Object.bsonsize(obj);
  var stats =
  {
    '_id': obj._id, 
    'bytes': size, 
    'KB': Math.round(size/(1024)), 
    'MB': Math.round(size/(1024*1024))
  };
  print(stats);
});

Điều này cũng có lợi thế là trả về JSON, vì vậy GUI như RoboMongo có thể lập bảng!

nguồn: https://stackoverflow.com/a/16957505/3933634

chỉnh sửa: cảm ơn @zAlbee đã hoàn thành đề xuất của bạn.


Đây chính xác là những gì tôi đang tìm kiếm nhưng nó không hoạt động có thể liên quan đến phiên bản mongo của tôi. hiện tại là 3,4?
Erce

Có ai khác nhận được TypeError: Object.bsonsize is not a functionkhông?
Félix Paradis

Bạn đã thử trong mongo shell chưa? Nó hoạt động: docs.mongodb.com/manual/reference/mongo-shell/#misfinity
Liberateur

Nhãn thích hợp sẽ là 'KiB': Math.round(size/(1024)), 'MiB': Math.round(size/(1024*1024))(hoặc'kB': Math.round(size/(1000)), 'MB': Math.round(size/(1000*1000))
Wernfried Domscheit

31

Dung lượng hiệu quả mà tài liệu sẽ chiếm trong bộ sưu tập sẽ nhiều hơn kích thước tài liệu của bạn do cơ chế Ghi đệm .

Đây là lý do tại sao có sự khác biệt giữa đầu ra của db.test.stats()Object.bsonsize(..).

Để có được kích thước chính xác (tính bằng byte) của tài liệu, hãy sử dụng Object.bsonsize()hàm.


Cảm ơn bạn đã trả lời, trong trường hợp đó, tôi có một câu hỏi khác liên quan đến vấn đề này: giả sử tôi có một bộ sưu tập nơi các tài liệu với danh sách dài các định danh được lưu dưới dạng danh sách. (số nhận dạng được lưu trữ ban đầu trong tệp txt-csv- với kích thước 300 kB; mỗi số nhận dạng dài 10 ký tự) Khi tôi chạy bsonsize trên tài liệu như vậy, kích thước thậm chí còn thấp hơn 481. Nó trả về 465. Bạn có thể giải thích cho tôi tình huống này, xin vui lòng?
user1949763

4
Kích thước nào được sử dụng để thực thi giới hạn kích thước tài liệu mongDB? Object.bsonsize ()?
John Evans

Kích thước tài liệu MongoDB là một hạn chế của Mongo, điều này được đề cập trong hướng dẫn sử dụng trên trang web của họ, 16MB. Tôi đã đạt đến giới hạn này một số lần khi thử nhập các bản ghi.
htm11h 10/03/2016

3

Với mongodb 4.4 (sắp có), Bạn có thể sử dụng bsonSizetoán tử để lấy kích thước tài liệu.

db.test.aggregate([
  {
    "$project": {
      "name": 1,
      "object_size": { "$bsonSize": "$$ROOT" }
    }
  }
])

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.