执行MongoDB映射的方法是通过java驱动程序减少作业,在该驱动程序中创建包含函数的作用域DBObject。
我可以在javascript中执行我的map reduce配置,其中传入的范围包含实用程序函数,但我无法弄清楚如何使用java驱动程序执行此操作。
我使用mapReduceCommand的
设置范围 c.addExtraOption("scope",new BasicDBObject().append('average',function(){ return false;}));
但是我无法让映射器/缩减器识别范围组件'例如'平均值作为函数。如果我使用引号,map reduce上下文认为它是一个String,但如果没有,我似乎无法使作用域组件解析。
如何通过java驱动程序在scope组件中获取函数?
感谢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 > arguments.length; i++) s += arguments[i];return s / arguments.length;}"/>
<constructor-arg><bean class="org.bson.BasicBSONObject"/></constructor-arg>
</bean>
</entry>
答案 0 :(得分:8)
服务器代码自动转换地图并缩减为Javascript函数,但范围不是这样。要在范围选项中传递函数,您可以改为:
c.addExtraOption("scope", new BasicBSONObject("average",
new CodeWScope("function(){ return false;}", new BasicBSONObject())));
答案 1 :(得分:1)
使用新的api(3.0)..我发现以下选项正在运行
collection
.mapReduce(map, reduce)
.scope(new Document("key", value))
.limit(100);
答案 2 :(得分: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()函数将在map函数中可见:
var mapFunction=function(){
transform();
emit(key,value);
}