【问题标题】:Calculating collection stats for a subset of documents in MongoDB计算 MongoDB 中文档子集的集合统计信息
【发布时间】:2014-11-07 07:49:33
【问题描述】:

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

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

有谁知道一种方法可以有效且准确地计算集合中记录集的总文档大小。

感谢您的帮助。

【问题讨论】:

  • 这似乎是一个如此明显的用例......为什么没有添加它?

标签: mongodb mongoose nosql-aggregation


【解决方案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 值的总和,按用户ID 过滤:

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 角落使用大小与处理能力,并在潜在的大文档中添加几个字节是可以忽略不计。
  • 插件叫什么名字?我想使用您的技术,但我无法从您的示例中收集到它。
  • 哦,我明白了——你写了一个插件!明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
相关资源
最近更新 更多