如何找到占用大量空间的MongoDB集合的元素?

时间:2012-01-15 19:41:55

标签: mongodb collections size diskspace

如果我有一个包含数千个元素的集合,有没有办法可以轻松找到哪些元素占用的空间最多(以MB为单位)?

2 个答案:

答案 0 :(得分:7)

没有内置查询,您必须迭代集合,收集每个文档的大小,然后进行排序。这是它的工作方式:

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

此时,您将拥有一个散列图,其中文档ID为键,其大小为值。 请注意,使用此方法,您将通过网络获取整个集合。另一种方法是使用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; })

内联:1告诉mongo不要为结果创建临时集合,所有内容都将保存在RAM中。

我的一个系列的示例输出:

[
    {
        "_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
    }
]
> 

答案 1 :(得分:2)

想出来了!我使用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();