Як отримати розмір одного документа в Mongodb?


87

Я зіткнувся з дивною поведінкою монго, і хотів би це трохи пояснити ...
Моє прохання таке просте: я хотів би отримати розмір одного документа у колекції. Я знайшов два можливих рішення:

  • Object.bsonsize - деякий метод javascript, який повинен повертати розмір у байтах
  • db.collection.stats () - де є рядок 'avgObjSize', який створює деякий "агрегований" (середній) розмір подання даних. Це просто представляє середній розмір одного документа.

  • Коли я створюю тестову колекцію лише з одним документом, обидві функції повертають різні значення. Як це можливо?
    Чи існує якийсь інший спосіб отримання розміру документа mongo?

Тут я надаю деякий код, на якому я виконую тестування:

  1. Я створив нову базу даних "тест" і ввів простий документ із лише одним атрибутом: type: "auto"

    db.test.insert({type:"auto"})
    
  2. вихід із виклику функції 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. вихід із виклику функції bsonsize: Object.bsonsize (db.test.find ({test: "auto"}))

    481
    

Відповіді:


179

У попередньому дзвінку Object.bsonsize()Mongodb повернув розмір курсору, а не документа.

Правильним способом є використання цієї команди:

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

За допомогою findOne()ви можете визначити свій запит для конкретного документа:

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

Це поверне правильний розмір (у байтах) конкретного документа.


1
Як отримати розмір списку документів із запитом?
Леон

Але, звичайно, цей код отримає документ перед обчисленням розміру.
Серкан Оздемір

Це не повертає розмір гуда: (... Але це: stackoverflow.com/a/40993183/3933634
Liberateur

3
Як отримати Object.bsonsize, що таке імпорт або необхідний оператор?
ПАРАМАНАНДА ПРАДГАН

7
Для всіх, хто пропустив, ви повинні використовувати findOneзамістьfind
Сем

36

Я рекомендував використовувати цей скрипт, щоб отримати реальний розмір.

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)');
});

Примітка. Якщо ваші ідентифікатори є 64-розрядними цілими числами, вищезазначене скоротить значення ідентифікатора під час друку! Якщо це так, ви можете використовувати замість цього:

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);
});

Це також має перевагу повернення JSON, тому графічний інтерфейс, такий як RoboMongo, може вносити його в таблицю!

джерело: https://stackoverflow.com/a/16957505/3933634

редагувати: дякую @zAlbee за вашу пропозицію щодо завершення.


Це саме те, що я шукаю, але це не працює, можливо, пов’язано з моєю версією mongo. поточний - 3,4?
Erce

Хтось ще отримує TypeError: Object.bsonsize is not a function?
Фелікс Параді

Ви пробували в монго оболонці? Це робота: docs.mongodb.com/manual/reference/mongo-shell/#miscellaneous
Liberateur

Правильний ярлик буде швидше 'KiB': Math.round(size/(1024)), 'MiB': Math.round(size/(1024*1024))(або'kB': Math.round(size/(1000)), 'MB': Math.round(size/(1000*1000))
Wernfried Domscheit

31

Ефективна кількість місця, яке займе документ у колекції, буде більшою за розмір вашого документа завдяки механізму відступів .

Ось чому існує різниця між виходами db.test.stats()і Object.bsonsize(..).

Щоб отримати точний розмір (у байтах) документа, дотримуйтесь Object.bsonsize()функції.


Дякую за вашу відповідь, у такому випадку у мене є ще одне запитання щодо цього питання: припустимо, у мене є колекція, де документи з довгим списком ідентифікаторів зберігаються у вигляді списку. (ідентифікатори зберігаються спочатку у файлі txt-csv - розміром 300 кБ; кожен ідентифікатор має 10 символів). Коли я запускаю bsonsize на такому документі, розмір навіть менший ніж 481. Він повертає 465. Чи можете ви пояснити мені цю ситуацію, будь ласка?
user1949763

4
Який розмір використовується для забезпечення обмеження розміру документа mongDB? Object.bsonsize ()?
Джон Еванс,

Розмір документа MongoDB є обмеженням для Mongo, про це йдеться в посібнику на їх веб-сайті, розміром 16 МБ. Я досягав цього обмеження кілька разів, намагаючись імпортувати записи.
htm11h

3

За допомогою mongodb 4.4 (майбутні) Ви можете використовувати bsonSizeоператор для отримання розміру документа.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.