J'ai rencontré un comportement étrange de mongo et je voudrais le clarifier un peu ...
Ma demande est aussi simple que ça: je voudrais avoir une taille de document unique en collection. J'ai trouvé deux solutions possibles:
- Object.bsonsize - une méthode javascript qui devrait renvoyer une taille en octets
- db.collection.stats () - où il y a une ligne 'avgObjSize' qui produit une vue de taille "agrégée" (moyenne) sur les données. Il représente simplement la taille moyenne d'un seul document.
Lorsque je crée une collection de test avec un seul document, les deux fonctions renvoient des valeurs différentes. Comment est-ce possible?
Existe-t-il une autre méthode pour obtenir la taille d'un document mongo?
Ici, je fournis du code sur lequel j'effectue des tests:
J'ai créé une nouvelle base de données 'test' et entré un document simple avec un seul attribut: type: "auto"
db.test.insert({type:"auto"})
sortie de l'appel de 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 fonction bsonsize: Object.bsonsize (db.test.find ({test: "auto"}))
481
la source
findOne
place defind
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 ID sont des entiers 64 bits, ce qui précède tronquera la valeur de l'ID lors de l'impression! Si tel 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 a également l'avantage de renvoyer JSON, donc une interface graphique comme RoboMongo peut le tabuler!
source: https://stackoverflow.com/a/16957505/3933634
edit: merci à @zAlbee pour votre suggestion.
la source
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))
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 de remplissage d'enregistrement .
C'est pourquoi il existe une différence entre les sorties de
db.test.stats()
etObject.bsonsize(..)
.Pour obtenir la taille exacte (en octets) du document, respectez la
Object.bsonsize()
fonction.la source
Avec mongodb 4.4 (à venir), vous pouvez utiliser l'
bsonSize
opérateur pour obtenir la taille du document.db.test.aggregate([ { "$project": { "name": 1, "object_size": { "$bsonSize": "$$ROOT" } } } ])
la source
Object.bsonsize (db.test.findOne ({type: "auto"})) Il donne en octets.
la source