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
Ответы
Ответ 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 для вашего предложения.