【问题标题】:Under MongoDB java driver Mapreduce command scope; add functions to ScopeMongoDB java驱动下Mapreduce命令范围;将函数添加到 Scope
【发布时间】:2016-10-17 21:12:49
【问题描述】:

他们是通过 java 驱动程序执行 MongoDB map reduce 作业的一种方式,您可以在其中创建包含函数的范围 DBObject。

我可以在 javascript 中执行我的 map reduce 配置,其中传入的范围包含实用程序函数,但我不知道如何使用 java 驱动程序执行此操作。

我使用 mapReduceCommand 设置范围

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

但是我无法让映射器/缩减器识别范围组件“例如”平均值作为函数。如果我使用引号,map reduce 上下文认为它是一个字符串,但如果不是,我似乎无法解析范围组件。

如何通过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 &gt; arguments.length; i++) s += arguments[i];return s / arguments.length;}"/>
            <constructor-arg><bean class="org.bson.BasicBSONObject"/></constructor-arg>
        </bean>
    </entry>

【问题讨论】:

  • 您能否提供更多详细信息,例如如何使用地图作为范围对象。有可能吗?

标签: mongodb mapreduce


【解决方案1】:

服务器代码会自动将 map 和 reduce 转换为 Javascript 函数,但范围不是这样。要在范围选项中传递函数,您可以这样做:

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

【讨论】:

  • 谢谢任。 Mongo 的这一部分没有像某些人希望的那样有很好的文档记录:) 所以找到答案是件好事。
【解决方案2】:

使用新的 api (3.0).. 我发现以下选项有效

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

【讨论】:

    【解决方案3】:

    对于那些难以使用 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); 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多