2012-04-05 3 views
5

함수를 포함하는 범위 DBObject를 만드는 Java 드라이버를 통해 MongoDB 맵 축소 작업을 실행하는 방법입니다.MongoDB java 드라이버에서 Mapreduce 명령 범위; 범위에 함수 추가

범위에서 전달 된 유틸리티 함수가있는 자바 스크립트에서 내 맵 축소 구성을 실행할 수는 있지만 자바 드라이버를 사용하여이를 수행하는 방법을 알 수 없습니다.

I 설정 범위를 인식 할 수 mapReduceCommand의

c.addExtraOption("scope",new BasicDBObject().append('average',function(){ return false;}));

나는 매퍼를 얻을 수 없다 그러나/감속기를 사용하여 범위 구성 요소 '예' 함수로 평균. 따옴표를 사용하면 map reduce context가 문자열을 생각하지만 그렇지 않다면 스코프 구성 요소를 구문 분석 할 수없는 것처럼 보입니다.

Java 드라이버를 통해 범위 구성 요소에서 함수를 가져 오는 방법은 무엇입니까?

Ren의 답변 덕분에 다음은 기능이있는 mongodb java 드라이버의 범위를 설정하는 스프링 빈 구성입니다.

<util:map id="mrScope" 
       key-type="java.lang.String" 
       value-type="java.lang.Object"> 
    <entry key="buckets"><bean class="com.mongodb.util.JSON" factory-method="parse"><constructor-arg value="[0,10,15,20,25,30,35,40,45,50,55,60,65]"/></bean></entry> 
    <entry key="average"> 
     <bean class="org.bson.types.CodeWScope"> 
      <constructor-arg value="function() {var s = 0;for (var i = 0; i &gt; arguments.length; i++) s += arguments[i];return s/arguments.length;}"/> 
      <constructor-arg><bean class="org.bson.BasicBSONObject"/></constructor-arg> 
     </bean> 
    </entry> 
+0

지도를 범위 객체로 사용하는 방법과 같은 자세한 정보를 제공해 주실 수 있습니까? 가능합니까? – gsuresh92

답변

8

서버 코드가 자동으로하지만 너무 범위가,지도를 변환하고 자바 스크립트 함수로 줄일 수 있습니다. 범위 옵션에서 함수를 전달하려면, 대신이 작업을 수행 할 수 있습니다

c.addExtraOption("scope", new BasicBSONObject("average", 
    new CodeWScope("function(){ return false;}", new BasicBSONObject()))); 
+0

우수, 감사합니다! – gbegley

+0

감사합니다. Ren. Mongo의이 부분은 어떤 사람들이 원하는만큼 문서화되지 않았습니다. :) 그래서 대답을 찾는 것이 좋습니다. –

1

을 새로운 API (3.0)과 함께 .. 나는 아래의 옵션들을 위해

collection .mapReduce(map, reduce) .scope(new Document("key", value)) .limit(100);

1

을하고있다 발견 자 ,

Map<String, Object> scopeVariables = new HashMap<>(); 
    String scopeFunction="function(){ //do something }"; 
    scopeVariables.put("transform", new CodeWScope(scopeFunction,new BasicBSONObject())); 

    MapReduceOptions options = new MapReduceOptions(); 
    options.scopeVariables(scopeVariables); 
    options.outputTypeInline(); 

    MapReduceResults<ValueObject> result = template.mapReduce("collection", mapFunction, reduceFunction, options, ValueObject.class); 

위의 코드를 실행 한 후 기능 맵 (F)에 표시 될 것이다) (변환 : MongoTemplate을 사용 범위에 함수를 적용하는 고투 예는 아래와 같다 작동 unction :

var mapFunction=function(){ 
    transform(); 
    emit(key,value); 
} 
관련 문제