3

SE の基本的なルールは、既に試したことの例を挙げずに質問しないことですが、この場合、どこから始めればよいかわかりません。MongoDB のドキュメントを見たところ、ストレージ使用量を計算する方法は 2 つしかないようです。

  1. db.collection.stats()コレクション全体に関する統計を返します。私の場合、コレクション内のデータのサブセット (特定のユーザーのデータ) によって使用されているストレージの量を知る必要があります。
  2. Object.bsonsize(<document>)1 つのレコードのストレージ サイズを返します。これには、各ドキュメントのサイズを一度に 1 つずつ計算するカーソル関数が必要です。このアプローチに関する私の唯一の懸念は、大量のデータでのパフォーマンスです。1 人のユーザーが何万ものドキュメントを持っている場合、このプロセスには時間がかかりすぎる可能性があります。

コレクション内の一連のレコードの合計ドキュメント サイズを効率的かつ正確に計算する方法を知っている人はいますか。

助けてくれてありがとう。

4

1 に答える 1

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
});
于 2014-11-06T23:49:33.203 に答える