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

计算MongoDB中文档子集的集合统计信息,mongodb,mongoose,nosql-aggregation,Mongodb,Mongoose,Nosql Aggregation,我知道SE的基本原则是在没有给出你已经尝试过的例子的情况下不要问问题,但在这种情况下,我找不到从哪里开始。我已经看过了MongoDB的文档,看起来只有两种方法可以计算存储使用率: db.collection.stats()返回整个集合的统计信息。在我的例子中,我需要知道集合中的数据子集(特定用户的数据)正在使用的存储量 Object.bsonsize()返回单个记录的存储大小,这需要一个游标函数来计算每个文档的大小,一次一个。我唯一关心的是这种方法在处理大量数据时的性能。如果单个用户拥有成千上万

我知道SE的基本原则是在没有给出你已经尝试过的例子的情况下不要问问题,但在这种情况下,我找不到从哪里开始。我已经看过了MongoDB的文档,看起来只有两种方法可以计算存储使用率:

  • db.collection.stats()
    返回整个集合的统计信息。在我的例子中,我需要知道集合中的数据子集(特定用户的数据)正在使用的存储量
  • Object.bsonsize()
    返回单个记录的存储大小,这需要一个游标函数来计算每个文档的大小,一次一个。我唯一关心的是这种方法在处理大量数据时的性能。如果单个用户拥有成千上万个文档,则此过程可能会花费太长时间
  • 是否有人知道一种高效、准确地计算集合中一组记录的聚合文档大小的方法


    感谢您的帮助。

    这可能不是最有效或最准确的方法,但我最终使用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();
        });
    }
    
    这将把schema对象转换为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
    });
    

    在阅读您的答案之前,我在想“可能在保存/更新期间将大小存储在单独的统计表中”。所以我同意这个解决方案(在阅读了其他有类似挑战的帖子后。关于增加存储大小,我们鼓励在nosql世界的角落使用大小与处理能力,并且在潜在的大文档中添加几个字节是可以忽略的。插件的名称是什么?我想用你的技术,但我无法从你的示例中收集到。哦,我明白了-y你写了一个插件!明白了。这似乎是一个显而易见的用例…为什么没有添加它?