MongoDB Java Driver 3.0 MapReduce

1.6k views Asked by At

This is the code I'm using to run map reduce on sourceCollectionName and to get the output to targetCollectionName. But the targetCollectionName is never created.

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

Although I'm able to get output as MapReduceIterable and when I iterate this the result is dumped as expected. Is this the right way to do it ?

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
}
2

There are 2 answers

1
jyemin On

Yes, this is the expected behavior. Since the MapReduceIterable is a fluent interface, there must be some way to signal the driver that it's time to actually do the map-reduce, and currently the only way to do that is to start iterating. If you really don't need the results, and want to short-cut the iteration, you can call the first() method instead (ignoring the result), which will return the first document and immediately close the cursor on the target collection.

0
cmvf On

Try following:

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