Mongo = получить размер одного документа - программирование
Подтвердить что ты не робот

Mongo = получить размер одного документа

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

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

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

  • Я создал новую базу данных "test" и ввел простой документ только с одним атрибутом: type: "auto"

    db.test.insert({type:"auto"})
    
  • вывод функции 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
    

    }

  • вывод из вызова функции bsonsize: Object.bsonsize(db.test.find({test: "auto" }))

    481
    
4b9b3361

Ответ 1

Я нашел решение. В предыдущем вызове Object.bsonsize mongo возвращал размер CURSOR, а не самого документа.

Правильный способ заключается в использовании этой команды:

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

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

Ответ 2

Эффективный объем пространства, который будет принимать документ в коллекции, будет больше, чем размер вашего документа из-за механизма Record Padding.

Вот почему существует разница между выходами db.test.stats() и Object.bsonsize(..).

Чтобы получить точный размер (в байтах) документа, придерживайтесь функции Object.bsonsize().

Ответ 3

Я рекомендовал использовать этот script для получения реального размера.

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, может его табулировать!

источник: fooobar.com/info/117437/...

изменить: спасибо @zAlbee для вашего предложения.