以下代码段在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”或其他一些提示来实现这一目标?
答案 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的块,但最后一个块除外。最后一个块只有必要的大小。同样,不大于块大小的文件只有最终的块,只需要使用所需的空间和一些额外的元数据。