1

10 万を超えるドキュメントを含む MongoDB コレクションがあります (この数は増え続けます)。各ドキュメントには、単一の値であるいくつかのフィールドと、それぞれが長さ 1000 の配列である約 50 のフィールドがあります。rmongodb を使用して R で結果を分析しています。

rmongodb ではmongo.find.all()、クエリを検索する基準の組み合わせに設定し、フィールドを返すフィールドのサブセットに設定して使用しています。mongo シェルで同等のものは次のようになります。

db.collection.find({query1 : "value1", query2 : "value2"},{field1 : 1, field2 : 1, field3 : 1})

これにより、結果の data.frame が返されます。これに対して後処理を行い、data.table を作成します。

私がやりたいことは、クエリにいくつかのセーフガードを追加することです。クエリが幅広く、返されるフィールドがより大きな配列フィールドの多くである場合、結果の data.table は数十 GB になる可能性があります。これは予想されることかもしれませんが、誰かが誤って数百 GB を一度に返そうとしないように、いくつかのフラグまたはエラー チェックを追加したいと考えています。

クエリに一致するドキュメントの数を取得できることはわかっています ( mongo.countrmongodbdb.collection.find({...},{...}).count()内、シェル内)。また、ドキュメントの平均サイズも取得できます ( db.collection.stats().avgObjSize)。

どうすればよいかわからない、または可能かどうかもわからないのは、検索が実際に返される前に、検索のサイズ (数値ではなく MB) を取得することです。フィールドのサブセットのみを返すことが多いため、count と avgObjSize では、結果の data.table の大きさを正確に見積もることはできません。サイズは、クエリとフィールドの両方を考慮する必要があります。

db.collection.find({},{}).sizeOf()find(query,fields) のサイズを MB で返すようなコマンドはありますか? 私が見ることができる唯一のオプションはcount()size()両方ともドキュメントの数を返します。

4

2 に答える 2

0

この状況で必要とされるこの柔軟性のためのスクリプトを書くことができます: (最大 1GB を返したいと思います)

    //limit 1GB
    var mbLimit = 1024*1024;
    //find number to show and round it to an int
    var numberShow = (mbLimit/db.restaurants.stats().avrObjSize) | 0;
    //limit the query
    db.restaurants.find({
       {query1 : "value1", query2 : "value2"},{field1 : 1, field2 : 1, field3 : 1}
        }).limit(numberShow)
于 2015-11-19T17:46:23.793 に答える