Mongodb mapreduce 関数は、find 関数のようにデータベースからレコードをスキップする方法を提供しません。クエリ、並べ替え、および制限オプションの機能があります。しかし、データベースからいくつかのレコードをスキップしたいのですが、どうにもなりません。解決策を提供してください。
前もって感謝します。
理想的には、適切に構造化されたmap-reduceクエリを使用すると、コレクション内の特定のドキュメントをスキップできます。
あるいは、Sergioが指摘しているように、map()で特定のドキュメントを発行することはできません。スコープを使用してグローバルカウンター変数を定義することは、発行を指定された範囲のドキュメントに制限する1つの方法です。例として、ObjectIDで並べ替えられた(したがって、挿入時間で並べ替えられた)最初の20個のドキュメントをスキップするには:
db.collection_name.mapReduce(map, reduce, {out: example_output, sort: {id:-1}, scope: "var counter=0")};
マップ機能:
function(){
counter ++;
if (counter > 20){
emit(key, value);
}
}
この機能がどのバージョンから利用できるようになったのかはわかりませんが、確かに MongoDB 2.6 ではmapReduce()
関数がquery
パラメータを提供します:
query
:ドキュメントオプション。マップ機能へのドキュメント入力を決定するために、クエリ演算子を使用して選択基準を指定します。
例
次のプロトタイプのドキュメントを含むコレクション オーダーに対して、次の map-reduce 操作を検討してください。
{
_id: ObjectId("50a8240b927d5d8b5891743c"),
cust_id: "abc123",
ord_date: new Date("Oct 04, 2012"),
status: 'A',
price: 25,
items: [ { sku: "mmm", qty: 5, price: 2.5 },
{ sku: "nnn", qty: 5, price: 2.5 } ]
}
mapFunction2、reduceFunction2、および finalizeFunction2 関数を使用して、orders コレクションに対して map-reduce 操作を実行します。
db.orders.mapReduce( mapFunction2,
reduceFunction2,
{
out: { merge: "map_reduce_example" },
query: { ord_date:
{ $gt: new Date('01/01/2012') }
},
finalize: finalizeFunction2
}
)
この操作では、クエリ フィールドを使用して、ord_date
より大きいドキュメントのみを選択しますnew Date(01/01/2012)
。次に、結果をコレクションに出力しますmap_reduce_example
。コレクションが既に存在する場合map_reduce_example
、オペレーションは既存のコンテンツをこの map-reduce オペレーションの結果とマージします。