Come posso trovare elementi di una raccolta MongoDB che occupano una grande quantità di spazio?
-
28-10-2019 - |
Domanda
Se ho una raccolta con migliaia di elementi, esiste un modo per trovare facilmente quali elementi occupano più spazio (in termini di MB)?
Soluzione
Non esiste una query incorporata per questo, devi iterare la raccolta, raccogliere le dimensioni per ogni documento e ordinare in seguito.Ecco come funzionerebbe:
var cursor = db.coll.find();
var doc_size = {};
cursor.forEach(function (x) {
var size = Object.bsonsize(x);
doc_size[x._id] = size;
});
A questo punto avrai una hashmap con gli ID del documento come chiavi e le loro dimensioni come valori. Nota che con questo approccio recupererai l'intera raccolta via cavo.Un'alternativa è usare MapReduce e fare questo lato server (all'interno di mongo):
> function mapper() {emit(this._id, Object.bsonsize(this));}
> function reducer(obj, size_in_b) { return { id : obj, size : size_in_b}; }
>
> var results = db.coll.mapReduce(mapper, reducer, {out : {inline : 1 }}).results
> results.sort(function(r1, r2) { return r2.value - r1.value; })
inline: 1 dice a mongo di non creare una raccolta temporanea per i risultati, tutto verrà mantenuto nella RAM.
E un output di esempio da una delle mie raccolte:
[
{
"_id" : ObjectId("4ce9339942a812be22560634"),
"value" : 1156115
},
{
"_id" : ObjectId("4ce9340442a812be24560634"),
"value" : 913413
},
{
"_id" : ObjectId("4ce9340642a812be26560634"),
"value" : 866833
},
{
"_id" : ObjectId("4ce9340842a812be28560634"),
"value" : 483614
},
...
{
"_id" : ObjectId("4ce9340742a812be27560634"),
"value" : 61268
}
]
>
Altri suggerimenti
Ho capito!L'ho fatto in due passaggi utilizzando Object.bsonsize () :
db.myCollection.find().forEach(function(myObject) {
db.objectSizes.save({object_id: object._id, size: Object.bsonsize(chain)});
});
db.objectSizes.find().sort({size: -1}).limit(5).pretty();