2012-04-05 12 views
5

Es su forma de ejecutar un trabajo de reducción de mapa MongoDB a través del controlador java en el que crea un objeto DBObject que contiene funciones.Bajo controlador de MongoDB java Alcance del comando Mapreduce; agregue funciones al Alcance

Puedo ejecutar mi mapa reducir la configuración en javascript donde el alcance pasado contiene funciones de utilidad, pero no puedo encontrar la manera de hacerlo con el controlador java.

I fijó el alcance usando

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

Sin embargo, no puede conseguir a los aplicadores/reductores de mapReduceCommand de reconocer el alcance componente 'por ejemplo' promedio como una función. Si utilizo comillas, el contexto reduce el contexto cree que es una Cadena, pero si no, no puedo hacer el análisis del componente del alcance.

¿Cómo se obtiene una función en el componente del alcance a través del controlador java?

Gracias a la respuesta de Ren, aquí hay una configuración de Spring Bean para configurar un alcance para el controlador mongodb java con una función.

<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

Puede proporcionarnos más detalles sobre cómo usar un Mapa como objeto de alcance ... ¿Es posible? – gsuresh92

Respuesta

8

El código del servidor convierte automáticamente el mapa y reducir en función de Javascript, pero no así con el alcance. Para pasar una función de la opción de ámbito, se puede hacer esto en su lugar:

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

Excelente, gracias! – gbegley

+0

Gracias Ren. Esta parte de Mongo no está tan bien documentada como a algunos les gustaría :) Así que es bueno encontrar las respuestas. –

1

Con la nueva API (3.0) .. me encontré con la siguiente opción está trabajando

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

1

Para quienes lucha con la aplicación de la función en su alcance el uso de MongoTemplate, ejemplo de abajo parece funcionar:

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

Después de ejecutar el código de seguridad, transformar() función será visible en el mapa f unction:

var mapFunction=function(){ 
    transform(); 
    emit(key,value); 
}