计算MongoDB中文档子集的收集统计信息

时间:2014-11-06 19:57:05

标签: mongodb mongoose nosql-aggregation

我知道SE的基本规则是在没有举例说明你已尝试过的情况下不问问题,但在这种情况下,我无法找到从哪里开始。我查看了MongoDB的文档,看起来只有两种方法来计算存储使用情况:

  1. db.collection.stats()返回有关整个集合的统计信息。就我而言,我需要知道集合中数据子集(特定用户的数据)所使用的存储量。
  2. Object.bsonsize(<document>)返回单个记录的存储大小,这需要一个游标函数来计算每个文档的大小,一次一个。我对这种方法唯一关心的是具有大量数据的性能。如果单个用户拥有数万个文档,则此过程可能需要很长时间。
  3. 是否有人知道如何有效准确地计算集合中记录集合的总文档大小。

    感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这可能不是最有效或最准确的方法,但我最终使用Mongoose插件来获取文档的JSON表示大小,然后保存:

module.exports = exports = function defaultPlugin(schema, options){
    schema.add({
        userId: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true },
        recordSize: Number
    });

    schema.pre('save', function(next) {
        this.recordSize = JSON.stringify(this).length;
        next();
    });
}

这会将架构对象转换为JSON表示,获取它的长度,然后将大小存储在文档本身中。我知道这实际上会增加一点额外的存储来记录大小,但它是我能想到的最好的。

然后,为了生成存储报告,我使用简单的aggregate调用来获取集合中所有recordSize值的总和,并按userId进行过滤:

mongoose.model('YouCollectionName').aggregate([
{
    $match: { 
        userId: userId
    }
},
{ 
    $group: {
        _id: null,
        recordSize: { $sum: '$recordSize'},
        recordCount: { $sum: 1 }
    }
}
], function (err, results) {
   //Do something with your results
});