5

関数を含むスコープDBObjectを作成するJavaドライバーを介してMongoDBマップリデュースジョブを実行する方法です。

渡されたスコープにユーティリティ関数が含まれているjavascriptでマップリデュース構成を実行できますが、javaドライバーでこれを行う方法がわかりません。

mapReduceCommandを使用してスコープを設定します

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

ただし、マッパー/リデューサーにスコープコンポーネントの「eg」平均を関数として認識させることができません。引用符を使用すると、マップリデュースコンテキストは文字列と見なしますが、そうでない場合は、スコープコンポーネントを解析できないようです。

Javaドライバーを介してスコープコンポーネントの関数を取得するにはどうすればよいですか?

Renの回答のおかげで、関数を使用してmongodbjavaドライバーのスコープを設定するためのSpringBean構成を次に示します。

    <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>
4

3 に答える 3

8

サーバーコードは自動的にマップを変換し、Javascript関数に変換しますが、スコープでは変換しません。スコープオプションで関数を渡すには、代わりに次のようにします。

c.addExtraOption("scope", new BasicBSONObject("average",
  new CodeWScope("function(){ return false;}", new BasicBSONObject())));
于 2012-04-06T15:52:31.247 に答える
1

新しいAPI(3.0)で..以下のオプションが機能していることがわかりました

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

于 2015-12-23T13:07:12.340 に答える
1

MongoTemplateを使用してスコープ内で関数を適用するのに苦労している人にとっては、以下の例が機能しているようです。

    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);

上記のコードを実行すると、transform()関数がマップ関数に表示されます。

var mapFunction=function(){  
  transform(); 
  emit(key,value); 
}
于 2016-10-17T13:12:49.780 に答える