javascript - query - node js mongodb example
Mongo=obtener tamaño de documento único (3)
He encontrado una solución. En la llamada anterior de Object.bsonsize, mongo devolvió el tamaño DEL CURSOR en lugar del documento en sí.
La forma correcta es usar este comando:
Object.bsonsize(db.test.findOne({type:"auto"}))
esto devolverá el tamaño correcto del documento particular (en bytes).
Encontré un comportamiento extraño de mongo y me gustaría aclararlo un poco ...
Mi pedido es simple: me gustaría obtener un tamaño de documento único en la colección. Encontré dos posibles soluciones:
- Object.bsonsize - Algún método de javascript que debería devolver un tamaño en bytes
- db.collection.stats () - donde hay una línea ''avgObjSize'' que produce una vista de tamaño "agregado" (promedio) en los datos. Simplemente representa el tamaño promedio del documento individual.
Cuando creo una colección de prueba con un solo documento, ambas funciones devuelven valores diferentes. ¿Como es posible?
¿Existe algún otro método para obtener un tamaño de un documento mongo?
Aquí, proporciono un código que realizo pruebas en:
Creé una nueva ''prueba'' de base de datos y acepto un documento simple con un solo atributo: escriba: "auto"
db.test.insert({type:"auto"})
salida de la función de stats () llamada: 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
}
salida de la llamada a la función bsonsize: Object.bsonsize (db.test.find ({test: "auto"}))
481
La cantidad efectiva de espacio que tomará el documento en la colección será mayor que el tamaño de su documento debido al mecanismo de relleno de registros .
Esta es la razón por la cual existe una diferencia entre las salidas de db.test.stats()
y Object.bsonsize(..)
.
Para obtener el tamaño exacto (en bytes) del documento, Object.bsonsize()
a la función Object.bsonsize()
.
Le recomendé usar este script para obtener el tamaño 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: ¡Si sus ID son enteros de 64 bits, lo anterior truncará el valor de ID al imprimir! Si ese es el caso, puede usar en su 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);
});
¡Esto también tiene la ventaja de devolver JSON, por lo que una GUI como RoboMongo puede tabularlo!
fuente: https://.com/a/16957505/3933634
editar: gracias a @zAlbee por su sugerencia de finalización.