Как получить размер одного документа в Mongodb?


87

Я столкнулся со странным поведением mongo и хотел бы немного его прояснить ...
Моя просьба проста: я хотел бы получить размер одного документа в коллекции. Я нашел два возможных решения:

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

  • Когда я создаю тестовую коллекцию только из одного документа, обе функции возвращают разные значения. Как это возможно?
    Существует ли какой-то другой способ получить размер документа mongo?

Здесь я привожу код, над которым я тестирую:

  1. Я создал новую базу данных "test" и ввел простой документ только с одним атрибутом: 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
Sam

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))
Вернфрид Домшайт,

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.