Encontrei um comportamento estranho de mongo e gostaria de esclarecê-lo um pouco ...
Meu pedido é simples assim: gostaria de obter um tamanho de documento único na coleção. Encontrei duas soluções possíveis:
- Object.bsonsize - algum método javascript que deve retornar um tamanho em bytes
- db.collection.stats () - onde há uma linha 'avgObjSize' que produz uma visão do tamanho "agregado" (médio) nos dados. Ele simplesmente representa o tamanho médio de um único documento.
Quando eu crio uma coleção de teste com apenas um documento, ambas as funções retornam valores diferentes. Como isso é possível?
Existe algum outro método para obter o tamanho de um documento mongo?
Aqui, eu forneço alguns códigos em que realizo testes:
Criei um novo banco de dados 'teste' e entrada documento simples com apenas um atributo: tipo: "auto"
db.test.insert({type:"auto"})
saída da chamada de função 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
}
saída da chamada de função bsonsize: Object.bsonsize (db.test.find ({test: "auto"}))
481
fonte
findOne
vez defind
Recomendei usar este script para obter o tamanho real.
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)'); });
Nota: Se seus IDs forem inteiros de 64 bits, o código acima irá truncar o valor do ID na impressão! Se for esse o caso, você pode usar em seu lugar:
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); });
Isso também tem a vantagem de retornar JSON, para que uma GUI como o RoboMongo possa tabulá-lo!
fonte: https://stackoverflow.com/a/16957505/3933634
editar: obrigado a @zAlbee por sua sugestão de conclusão.
fonte
TypeError: Object.bsonsize is not a function
?'KiB': Math.round(size/(1024)), 'MiB': Math.round(size/(1024*1024))
(ou'kB': Math.round(size/(1000)), 'MB': Math.round(size/(1000*1000))
A quantidade efetiva de espaço que o documento ocupará na coleção será maior do que o tamanho do seu documento devido ao mecanismo de preenchimento de registro .
É por isso que há uma diferença entre as saídas de
db.test.stats()
eObject.bsonsize(..)
.Para obter o tamanho exato (em bytes) do documento, siga a
Object.bsonsize()
função.fonte
Com mongodb 4.4 (a ser lançado), você pode usar o
bsonSize
operador para obter o tamanho do documento.db.test.aggregate([ { "$project": { "name": 1, "object_size": { "$bsonSize": "$$ROOT" } } } ])
fonte
Object.bsonsize (db.test.findOne ({type: "auto"})) Fornece em bytes.
fonte