1

Mongoで、mycollectionフィールド、、、およびを含むコレクションがあるabhugeます。aでクエリ、mapreduce、updatesなどを頻繁に実行したいのですが、クエリ結果もb返したい場合があります。huge

これdb.mycollection.find()により、コレクション全体がスキャンされ、Mongoがコレクション全体をワーキングセットに追加しようとすることになります。これは、使用可能なRAMの量を超える可能性があります。

代わりにを呼び出すとdb.mycollection.find({}, { a : 1, b : 1 })、コレクション全体がワーキングセットに追加されるのでしょうか、それとも予測の条件のみが追加されるのでしょうか。

4

1 に答える 1

3

MongoDBは、カバードクエリと呼ばれるものを使用できます。http://docs.mongodb.org/manual/applications/indexes/#create-indexes-that-support-covered-queriesこれらを使用すると、インデックスからすべての値をロードできます。ディスク、またはメモリ(それらのドキュメントがその時点でメモリ内にある場合)。

全表スキャンでは対象クエリを使用できないことに注意してください。条件、射影、および並べ替えはすべてインデックス内にある必要があります。すなわち:

db.col.ensureIndex({a:1,b:1});
db.col.find({a:1}, {_id:0, a:1, b:1})(.sort({b:1}));

動作します(完全に必要なわけではないため、並べ替えは角かっこで囲まれています)。_idそれを返すつもりなら、あなたはあなたのインデックスに加えることができます。

Map Reduceは対象クエリをサポートしていません。私が知る限り、特定の量のフィールドのみをMRに投影する方法はありません。多分私が知らないいくつかのハックがあります。Map Reduceは$match、入力クエリに関して同様の演算子のみをサポートし、受信クエリの種類に個別のパラメーターを使用します(http://docs.mongodb.org/manual/applications/map-reduce/)。

更新については、不可分操作のみを信じていることに注意してください:http: //docs.mongodb.org/manual/tutorial/isolate-sequence-of-operations/(を除くfindAndModify)は、ドキュメントをワーキングセットにロードしませんが、そこにキーワード。

これらのレコードに対してMRと通常の検索と更新の両方を行う必要があることを考えると、なぜこれほど多くのデータをページングしているのか、本当に頻繁に行う必要があるのか​​を確認することを強くお勧めします。短時間で頻繁に処理をやりすぎているようです。

一方、これが毎晩実行されるスクリプトか何かである場合、その過度のワーキングセット(つまり、スコアボードの再計算スクリプト)についてはあまり心配しません。

于 2013-01-21T21:36:44.813 に答える