J'ai rencontré un comportement étrange de mongo et je voudrais clarifier un peu ...
Ma demande est aussi simple que cela: je voudrais obtenir une taille de document unique en collection. J'ai trouvé deux solutions possibles:
Ici, je fournis du code sur lequel je teste:
J'ai créé une nouvelle base de données 'test' et saisi un document simple avec un seul attribut: type: "auto"
db.test.insert({type:"auto"})
sortie de l'appel de la fonction 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
}
sortie de l'appel de la fonction bsonsize: Object.bsonsize (db.test.find ({test: "auto"})))
481
J'ai trouvé une solution. Dans l'appel précédent de Object.bsonsize, mongo renvoyait la taille du curseur plutôt que le document lui-même.
La bonne façon est d'utiliser cette commande:
Object.bsonsize(db.test.findOne({type:"auto"}))
cela retournera la taille correcte du document particulier (en octets).
La quantité effective d'espace que le document prendra dans la collection sera supérieure à la taille de votre document en raison du mécanisme Record Padding .
C'est pourquoi il y a une différence entre les sorties de db.test.stats()
et Object.bsonsize(..)
.
Pour obtenir la taille du document exacte (en octets), utilisez la fonction Object.bsonsize()
.
J'ai recommandé d'utiliser ce script pour obtenir la taille réelle.
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)');
});
Remarque: Si vos identifiants sont des entiers 64 bits, les informations ci-dessus tronqueront la valeur de l'identifiant lors de l'impression! Si c'est le cas, vous pouvez utiliser à la place:
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);
});
Cela présente également l’avantage de renvoyer du JSON, ce qui permet à une interface graphique telle que RoboMongo de la tabuler!
source: https://stackoverflow.com/a/16957505/3933634
éditez: merci à @ zAlbee pour votre suggestion de finalisation.