Как мне найти элементы коллекции MongoDB, которые занимают много места? - PullRequest
2 голосов
/ 15 января 2012

Если у меня есть коллекция с тысячами элементов, можно ли легко найти, какие элементы занимают больше всего места (в мегабайтах)?

Ответы [ 2 ]

7 голосов
/ 15 января 2012

Для этого нет встроенного запроса, вам нужно выполнить итерацию коллекции, собрать размер для каждого документа и отсортировать впоследствии.Вот как это будет работать:

var cursor = db.coll.find(); 
var doc_size = {}; 
cursor.forEach(function (x) { 
    var size = Object.bsonsize(x); 
    doc_size[x._id] = size;
});

На этом этапе у вас будет хэш-карта с идентификаторами документов в качестве ключей и их размерами в качестве значений.Обратите внимание, что при таком подходе вы будете получать всю коллекцию по проводам.Альтернативой является использование MapReduce и выполнение этого на стороне сервера (внутри 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 говорит mongo не создавать временную коллекцию для результатов, все будет храниться в оперативной памяти.

И пример вывода из одной из моих коллекций:

[
    {
        "_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
    }
]
> 
2 голосов
/ 16 января 2012

понял это! Я сделал это в два этапа, используя 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();  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...