2012-05-09 1 views
3

Mongodb mapreduce 함수는 find 함수와 같이 데이터베이스에서 레코드를 건너 뛸 수있는 방법을 제공하지 않습니다. 쿼리의 기능을 가지고 있으며, & 제한 옵션을 정렬하십시오. 하지만 데이터베이스에서 일부 레코드를 건너 뛰고 싶습니다. 그리고 그 레코드를 얻는 방법이 없습니다. 해결책을 제시하십시오.mongodb mapreduce 함수는 스킵 기능을 제공하지 않습니다. 이것에 대한 해결책은 무엇입니까?

미리 감사드립니다.

답변

12

잘 구조화 된 map-reduce 쿼리를 사용하면 컬렉션의 특정 문서를 건너 뛸 수 있습니다.

세르지오 (Sergio)가 지적했듯이 map()에서는 특정 문서를 단순히 출력 할 수 없습니다. 범위를 사용하여 전역 카운터 변수를 정의하는 것은 emit을 지정된 범위의 문서로 제한하는 한 가지 방법입니다.

db.collection_name.mapReduce(map, reduce, {out: example_output, sort: {id:-1}, scope: "var counter=0")}; 

지도 기능 : 예를 들어, (삽입 시간으로 분류하여과) OBJECTID으로 분류되어 처음 20 개 문서 건너 뛸

function(){ 
    counter ++; 
    if (counter > 20){ 
     emit(key, value); 
    } 
} 
+0

감사합니다. 이것이 내가 원하는 것입니다. –

0

잘 모르겠어요을하는 버전 이후 이 기능을 사용할 수 있지만 확실히 MongoDB를 2.6에서 mapReduce() function provides query parameter :

query : 문서

선택 사항. 쿼리 연산자를 사용하여 선택 기준을 지정하여 맵에 입력 된 문서를 결정합니다.

고려하여 다음과 같은 프로토 타입의 문서가 포함 된 컬렉션을 주문에 대한 작업을지도-감소 다음

{ 
    _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 함수

db.orders.mapReduce(mapFunction2, 
       reduceFunction2, 
       { 
        out: { merge: "map_reduce_example" }, 
        query: { ord_date: 
           { $gt: new Date('01/01/2012') } 
          }, 
        finalize: finalizeFunction2 
       } 
       ) 

이 작업은 new Date(01/01/2012)보다 큰 ord_date 만 해당 문서를 선택 쿼리 필드를 사용합니다. 그런 다음 결과를 콜렉션 map_reduce_example에 출력합니다. map_reduce_example 컬렉션이 이미 존재하면 작업은 기존 내용을이 map-reduce 작업의 결과와 병합합니다.

관련 문제