我知道SE的基本规则是在没有举例说明你已尝试过的情况下不问问题,但在这种情况下,我无法找到从哪里开始。我查看了MongoDB的文档,看起来只有两种方法来计算存储使用情况:
db.collection.stats()
返回有关整个集合的统计信息。就我而言,我需要知道集合中数据子集(特定用户的数据)所使用的存储量。Object.bsonsize(<document>)
返回单个记录的存储大小,这需要一个游标函数来计算每个文档的大小,一次一个。我对这种方法唯一关心的是具有大量数据的性能。如果单个用户拥有数万个文档,则此过程可能需要很长时间。是否有人知道如何有效准确地计算集合中记录集合的总文档大小。
感谢您的帮助。
答案 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
});