如何使用java驱动程序将mongo mapreduce结果存储在不同的数据库中

时间:2013-07-23 05:26:27

标签: java mongodb collections mapreduce

以下代码段在java中使用时效果很好。但有没有办法在mongodb mapreduce中使用java驱动程序将结果存储到不同的数据库中。我想要这样做因为mapreduce无法创建上限集合。所以我想将mapreduce的结果写入不同的集合,并在目标数据库中创建一个上限集合并插入到该集合中。

`MapReduceCommand wktgtcmd = new MapReduceCommand(tgtCollection, wk_map_function, tgt_reduce_function, 
                    "collection String", MapReduceCommand.OutputType.MERGE, null);
tgtCollection.mapReduce(wktgtcmd);`

类似“ 数据库 .Collection String”或其他一些提示来实现这一目标?

2 个答案:

答案 0 :(得分:2)

通常你可以调用 MapReduceCommand.setOutputDB 方法告诉map reduce命令使用哪个数据库。

然而,在从mongo shell进行快速测试之后,如果mongodb服务器被限制,它看起来就像首先丢弃该集合。

如果您希望结果进入上限集合,那么最简单的方法是将结果内联并手动将它们插入到上限集合中:

MapReduceCommand wktgtcmd = new MapReduceCommand(tgtCollection, 
                                                 wk_map_function, 
                                                 tgt_reduce_function, 
                                                 null,
                                                 MapReduceCommand.OutputType.INLINE, 
                                                 null);
 MapReduceOutput out = tgtCollection.mapReduce(cmd);


 DB db = mongo.getDB("database");
 DBCollection results = db.getCollection("collection");
 for (DBObject o : out.results()) {
    results.insert(o);
 }

答案 1 :(得分:0)

自己存储结果。如果它超过16MB BSON限制。使用GridFS!

https://docs.mongodb.com/manual/core/gridfs/

GridFS是用于存储和检索超过BSON文档大小限制为16 MB的文件的规范。

GridFS不是将文件存储在单个文档中,而是将文件分成多个部分或块[1],并将每个块存储为单独的文档。默认情况下,GridFS使用255 kB的块大小;也就是说,GridFS将文件分成255 kB的块,但最后一个块除外。最后一个块只有必要的大小。同样,不大于块大小的文件只有最终的块,只需要使用所需的空间和一些额外的元数据。