Я столкнулся со странным поведением 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
javascript
mongodb
document
objectid
objectsize
user1949763
источник
источник
findOne
вместоfind
Я рекомендовал использовать этот скрипт, чтобы получить реальный размер.
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 за ваше предложение завершения.
источник
TypeError: Object.bsonsize is not a function
?'KiB': Math.round(size/(1024)), 'MiB': Math.round(size/(1024*1024))
(или'kB': Math.round(size/(1000)), 'MB': Math.round(size/(1000*1000))
Эффективное пространство, которое документ займет в коллекции, будет больше, чем размер вашего документа из-за механизма заполнения записи .
Вот почему существует разница между выходными сигналами
db.test.stats()
иObject.bsonsize(..)
.Чтобы получить точный размер (в байтах) документа, придерживайтесь
Object.bsonsize()
функции.источник
В mongodb 4.4 ( готовится к выпуску) вы можете использовать
bsonSize
оператор для получения размера документа.db.test.aggregate([ { "$project": { "name": 1, "object_size": { "$bsonSize": "$$ROOT" } } } ])
источник
Object.bsonsize (db.test.findOne ({type: "auto"})) Выдает в байтах.
источник