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と通常の検索と更新の両方を行う必要があることを考えると、なぜこれほど多くのデータをページングしているのか、本当に頻繁に行う必要があるのかを確認することを強くお勧めします。短時間で頻繁に処理をやりすぎているようです。
一方、これが毎晩実行されるスクリプトか何かである場合、その過度のワーキングセット(つまり、スコアボードの再計算スクリプト)についてはあまり心配しません。