这是我用来在sourceCollectionName
上运行map reduce并将输出提供给targetCollectionName
的代码。但是永远不会创建targetCollectionName。
new MongoClient("localhost").getDatabase(dbName).getCollection(sourceCollectionName)
.mapReduce(map, reduce)
.action(MapReduceAction.REPLACE)
.databaseName(dbName)
.collectionName(targetCollectionName)
.sharded(false);
虽然我能够将输出作为MapReduceIterable
,但是当我迭代它时,结果将按预期转储。这是正确的方法吗?
MapReduceIterable mapReduceIterable = new MongoClient("localhost").getDatabase(dbName).getCollection(sourceCollectionName)
.mapReduce(map, reduce)
.action(MapReduceAction.REPLACE)
.databaseName(dbName)
.collectionName(targetCollectionName)
.sharded(false);
for(Object o:mapReduceIterable){
//Just Iterating makes map reduce to dump output collection
}
答案 0 :(得分:5)
是的,这是预期的行为。由于MapReduceIterable是一个流畅的接口,因此必须有一些方法来向驱动程序发出信号,告知它实际执行map-reduce的时间,目前唯一的方法是开始迭代。如果你真的不需要结果,并希望缩短迭代次数,你可以调用first()方法(忽略结果),这将返回第一个文档并立即关闭光标目标集合。
答案 1 :(得分:0)
尝试以下操作:
new MongoClient("localhost").getDatabase(dbName).getCollection(sourceCollectionName)
.mapReduce(map, reduce)
.action(MapReduceAction.REPLACE)
.databaseName(dbName)
.collectionName(targetCollectionName)
.sharded(false)
.toCollection()