3

Mongodb mapreduce 関数は、find 関数のようにデータベースからレコードをスキップする方法を提供しません。クエリ、並べ替え、および制限オプションの機能があります。しかし、データベースからいくつかのレコードをスキップしたいのですが、どうにもなりません。解決策を提供してください。

前もって感謝します。

4

2 に答える 2

12

理想的には、適切に構造化された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);
    }
}
于 2012-05-09T17:51:35.313 に答える
0

この機能がどのバージョンから利用できるようになったのかはわかりませんが、確かに 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 オペレーションの結果とマージします。

于 2014-04-29T07:58:44.823 に答える