我想我找到了...
我深入研究了 mongodb 的 Java 驱动程序源,似乎可以隐式访问 INLINE 输出功能:
class MapReduceIterableImpl<TDocument, TResult>(MapReduceIterableImpl.java),这是接口返回类型mapReduce()的默认实现,
持有一个private boolean inline,初始值为true。
唯一可以切换到false的地方是方法collectionName(final String collectionName),其描述如下:
为 MapReduce 的输出设置 collectionName
默认操作是替换集合(如果存在),以更改此使用操作(com.mongodb.client.model.MapReduceAction)。
如果您在mapReduce() 之后从未在对象实例上调用此方法,则它将保持true 初始化...意思是:如果没有输出集合,则它必须是内联的。
稍后,当您在内部使用 iterator(), first(), forEach(...) 等访问结果时,将调用 execute() 方法,该方法具有神奇的 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);
...所以当 collectionName() 未被调用时,它正在实例化 MapReduceWithInlineResultsOperation。
我没有机会测试它,因为我的 NetBeans 目前讨厌我,但我认为这很清楚。
你觉得呢,我错过了什么吗?
如果我能帮助您将代码转移到 API 3.x 将很高兴,很棒的项目!