【问题标题】:MongoDB Java Driver 3.0 MapReduceMongoDB Java 驱动程序 3.0 MapReduce
【发布时间】:2015-06-22 11:08:19
【问题描述】:

这是我用来在 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
}

【问题讨论】:

    标签: mongodb mongodb-java


    【解决方案1】:

    是的,这是预期的行为。由于 MapReduceIterable 是一个流畅的接口,因此必须有某种方法来通知驱动程序是时候实际执行 map-reduce 了,而目前唯一的方法是开始迭代。如果你真的不需要结果,并且想缩短迭代,你可以调用first() 方法代替(忽略结果),它将返回第一个文档并立即关闭目标集合上的光标。

    【讨论】:

    • 是的。这将解决我对不必要迭代的担忧。 :)
    【解决方案2】:

    尝试以下操作:

    new MongoClient("localhost").getDatabase(dbName).getCollection(sourceCollectionName)
                .mapReduce(map, reduce)
                    .action(MapReduceAction.REPLACE)
                    .databaseName(dbName)
                    .collectionName(targetCollectionName)
                    .sharded(false)
                    .toCollection()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      相关资源
      最近更新 更多