2012-04-05 9 views
5

È un modo per eseguire una mappa MongoDB ridurre il lavoro tramite il driver java in cui si crea un oggetto DBObject che contiene funzioni.In MongoDB driver java Scopo del comando Mapreduce; aggiungere funzioni a Scope

Posso eseguire la mia mappa ridurre la configurazione in javascript dove il campo di applicazione passato contiene funzioni di utilità, ma non riesco a capire come farlo con il driver java.

ho configurato l'ambito utilizzando del mapReduceCommand

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

Tuttavia non posso ottenere i mapper/riduttori di riconoscere la portata componente 'per esempio' media come una funzione. Se uso le virgolette, la mappa riduce il contesto e si ritiene che sia una stringa, ma in caso contrario, non riesco a far analizzare il componente scope.

Come si ottiene una funzione nel componente oscilloscopio tramite il driver java?

Grazie alla risposta di Ren, ecco una configurazione di bean di primavera per impostare uno scope per il driver java mongodb con una funzione.

<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

Potete fornire ulteriori dettagli come utilizzare una mappa come oggetto di ambito .. È possibile? – gsuresh92

risposta

8

Il codice server converte automaticamente la mappa e ridurre in funzione Javascript, ma non così con campo di applicazione. Per passare una funzione nell'opzione ambito, è possibile fare questo, invece:

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

Eccellente, grazie! – gbegley

+0

Grazie Ren. Questa parte di Mongo non è ben documentata come alcuni vorrebbero :) Quindi è bene trovare le risposte. –

1

Con la nuova API (3.0) .. ho trovato l'opzione in basso sta lavorando

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

1

Per coloro che lotta con l'applicazione della funzione in ambito utilizzando MongoTemplate, esempio sotto sembra funzionare:

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

Dopo l'esecuzione codice precedente, transform() funzione sarà visibile in funzione f unzione:

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