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

发布于 2024-12-27 04:11:48 字数 60 浏览 1 评论 0原文

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

If I have a collection with thousands of elements, is there a way I can easily find which elements are taking up the most space (in terms of MB)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

薄荷梦 2025-01-03 04:11:48

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

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; })

inline: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
    }
]
> 

There's no built-in query for this, you have to iterate the collection, gather size for each document, and sort afterwards. Here's how it'd work:

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

At this point you'll have a hashmap with document ids as keys and their sizes as values.
Note that with this approach you will be fetching the entire collection over the wire. An alternative is to use MapReduce and do this server-side (inside 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 tells mongo not to create a temporary collection for results, everything will be kept in RAM.

And a sample output from one of my collections:

[
    {
        "_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
    }
]
> 
雨轻弹 2025-01-03 04:11:48

想通了这一点!我使用 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();  

Figured this out! I did this in two steps using 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();  
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文