2015-06-22 129 views
2

这是我用来运行地图减少sourceCollectionName并得到输出到targetCollectionName的代码。但是targetCollectionName永远不会被创建。MongoDB Java驱动程序3.0 MapReduce

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 
} 

回答

5

是的,这是预期的行为。由于MapReduceIterable是一个流畅的界面,因此必须有某种方式向驱动程序发出信号,说明是时候实际执行map-reduce了,目前唯一的方法就是开始迭代。如果您确实不需要结果,并且想要快速重复迭代,则可以调用first()方法(忽略结果),该方法将返回第一个文档并立即关闭目标集合上的光标。

+0

是的。这将解决我对不必要迭代的担心。 :) – Harshil