2012-04-05 27 views
5

是他们通过创建包含函数的作用域DBObject的java驱动程序执行MongoDB map reduce作业的一种方式。在MongoDB下java驱动程序的Mapreduce命令范围;将函数添加到作用域

我可以在javascript中执行我的map缩减配置,其中传入的范围包含实用程序函数,但我无法弄清楚如何使用java驱动程序执行此操作。

我安装使用mapReduceCommand的

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

但是我不能得到映射器/减速器识别范围的范围组件“例如”平均作为一个函数。如果我使用引号,映射reduce上下文认为它是一个String,但是如果没有,我似乎无法使范围组件解析。

如何通过java驱动程序获取作用域组件中的函数?

感谢Ren的回答,下面是一个spring bean配置,用于为函数设置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 2015-12-23 09:38:01

回答

8

服务器代码自动转换地图和降低成JavaScript功能,但不能因此与范围。要通过在作用域选项的功能,你可以这样做,而不是:

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

非常好,谢谢! – gbegley 2012-04-06 19:41:30

+0

谢谢仁。这部分的Mongo没有像有些人想要的那么好记录:)所以很高兴找到答案。 – 2013-08-16 14:18:24

1

有了新的API(3.0)..我发现下面的选项工作

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

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

上面运行的代码后,变换()函数将在映射f可见联合:

var mapFunction=function(){ 
    transform(); 
    emit(key,value); 
} 
相关问题