我想我找到了它... 我深入瞭解了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 MapReduceWithInlineResultsOperation
時collectionName()
沒有被調用。
我沒有機會測試它,因爲我的NetBeans此刻討厭我,但我認爲它很清楚。 你怎麼看,我錯過了什麼?
如果我可以幫助您將代碼轉移到API 3.x這個偉大的項目,會很高興!