2016-06-13 73 views
1

如何使用mongodb java驅動程序3.2從mapReducet獲取內聯結果?mapReduce使用java mongodb驅動程序的內聯結果3.2

與司機2.x版本我做:

DBColleciont coll = client.getDB(dbName).getCollection(collName); 
coll.mapReduce(map, reduce, null, OutputType.INLINE, query); 

新的3.x驅動程序有兩個的MapReduce()方法返回MapReduceIterable這偏出指定INLINE輸出模式的方法。

MongoCollection<Documetn> coll = client.getDatabase(dbName).getCollection(collName) 
coll 
    .mapReduce(map, reduce). 
    .filter(query); 

回答

1

我想我找到了它... 我深入瞭解了mongodb的Java驅動程序源代碼, INLINE輸出要素是隱式訪問:

class MapReduceIterableImpl<TDocument, TResult>MapReduceIterableImpl.java),這是mapReduce()接口返回類型的默認實現, 持有private boolean inline與初始值true

如果這都不能切換到false唯一的地方是方法collectionName(final String collectionName)用於其描述如下:

設置集合名的MapReduce的 的默認操作的輸出被替換集合如果存在,則更改此使用操作(com.mongodb.client.model.MapReduceAction)。

如果你從來沒有mapReduce()後呼籲對象實例這種方法,它仍將作爲true初始化...這意味着:如果沒有輸出集合,它必須是內聯。

後來,當你與iterator(), first(), forEach(...)等內部的​​方法被調用是叫魔if條件訪問結果:

if (inline) { 
     MapReduceWithInlineResultsOperation<TResult> operation = 
       new MapReduceWithInlineResultsOperation<TResult>(namespace, 
         new BsonJavaScript(mapFunction), 
         new BsonJavaScript(reduceFunction), 
         codecRegistry.get(resultClass)) 
         .filter(toBsonDocument(filter)) 
         .limit(limit) 
         .maxTime(maxTimeMS, MILLISECONDS) 
         .jsMode(jsMode) 
         .scope(toBsonDocument(scope)) 
         .sort(toBsonDocument(sort)) 
         .verbose(verbose) 
         .readConcern(readConcern); 
.... 

} else { 
     MapReduceToCollectionOperation operation = 
       new MapReduceToCollectionOperation(namespace, new BsonJavaScript(mapFunction), new BsonJavaScript(reduceFunction), 
         collectionName) 
         .filter(toBsonDocument(filter)) 
         .limit(limit) 
         .maxTime(maxTimeMS, MILLISECONDS) 
         .jsMode(jsMode) 
         .scope(toBsonDocument(scope)) 
         .sort(toBsonDocument(sort)) 
         .verbose(verbose) 
         .action(action.getValue()) 
         .nonAtomic(nonAtomic) 
         .sharded(sharded) 
         .databaseName(databaseName) 
         .bypassDocumentValidation(bypassDocumentValidation); 

...所以它是instanciating MapReduceWithInlineResultsOperationcollectionName()沒有被調用。

我沒有機會測試它,因爲我的NetBeans此刻討厭我,但我認爲它很清楚。 你怎麼看,我錯過了什麼?

如果我可以幫助您將代碼轉移到API 3.x這個偉大的項目,會很高興!

2

您可以手動創建的map-reduce命令:

String mapFunction = ... 
    String reduceFunction = ... 

    BsonDocument command = new BsonDocument(); 

    BsonJavaScript map = new BsonJavaScript(mapFunction); 
    BsonJavaScript red = new BsonJavaScript(reduceFunction); 
    BsonDocument query = new BsonDocument("someidentifier", new BsonString("somevalue")); 
    command.append("mapreduce", new BsonString("mySourceCollection")); 
    command.append("query", query); 
    command.append("map", map); 
    command.append("reduce", red); 
    command.append("out", new BsonDocument("inline", new BsonBoolean(true))); 

    Document result = mongoClient.getDatabase(database).runCommand(command); 

我覺得這是非常醜陋的,但它是唯一可行的解​​決方案,我發現到目前爲止使用3.2。 (...並且會對更好的變體非常感興趣... ;-))