【问题标题】:Mongo DB Map Reduce when trying to process more than 100 recordsMongodb Map Reduce 尝试处理超过 100 条记录时
【发布时间】:2016-01-06 09:00:54
【问题描述】:

我是 Mongo DB 的新手,我正在使用 Mongo DB 2.4.4。当我们尝试在 Mapreduce 中传递超过 100 条记录时,我们收到以下错误:

com.mongodb.CommandFailureException: { "serverUsed" : "localhost/XXXX" , "errmsg" : "exception: TypeError: Cannot read property 'AAAA' of undefined\n    at _funcs2:1:296\n    at Array.forEach (native)\n    at _funcs2 (_funcs2:1:252) near 'ssionEvent.AAAA>0)

以下是正在使用的MapReduceCommand

MapReduceCommand(eventsCollection,map,reduce,null,MapReduceCommand.OutputType.INLINE, compoundquery);

我有相同的记录,但如果记录数超过 100 则显示上述错误,如果小于 100 则处理成功。 我们在应用程序中使用以下 mongo 选项。

"maxWaitTime=300"
"connectionsPerHost=100"
"threadsAllowedToBlockForConnectionMultiplier=1500" 
"socketKeepAlive=true"
"connectTimeout=60000"
"socketTimeout=60000"
"autoConnectRetry=true"

Map、reduce、复合查询详细介绍如下:

String map = "function() {"+
" if (this.Doc1 !== undefined & this.Doc1.innerDoc1 !== undefined) { "+
"emit({field1:this.Doc1.innerDoc1.field1,field2:this.Doc1.field2,field3:this.Doc1.field3,field4:this.Doc1.field4,field5:this.Doc1.field5},this);}";
String reduce = "function(keyMappedId, valuesPrices){"+
 "var amtValue1=0;"+ 
 "var processedObj=new Object();"+
 "valuesPrices.forEach(function(doc){"+
 if(doc.Doc1 !== undefined && doc.Doc1.AmtValue !== undefined && doc.Doc1.AmtValue>0){"+ 
     "var amtNumber=new Number(doc.Doc1.AmtValue);"+ 
     "amtValue1=amtNumber;}});"+
"if(amtValue1>0 && valuesPrices[0].Doc1 !== undefined){"+
        "valuesPrices[0].Doc1.AmtValue=amtValue1; }"+
"processedObj=valuesPrices[0];"+ 
"return {aggregatedObject:processedObj};}";



DBObject compoundquery =  QueryBuilder.start("_id").in(idList).get();

其中 idList 将包含集合中我想要传递给 map reduce 的文档的“_id”

MapReduceCommand cmd=null;
cmd = new MapReduceCommand("MyCollection",map,reduce,null,MapReduceCommand.OutputType.INLINE, compoundquery);
            MapReduceOutput out = eventsCollection.mapReduce(cmd);

添加错误输出如下:103条记录

{ "aggregatedObject" : { "aggregatedObject" : { "_id" : "Order_REC16904427" , "Status" : "PROCESSING" , "Doc1" : { "field1" : "ABCS57829" , "field2" : "XYZ" , "AmtValue" : 9000.0 , "field3" : "AAAABCD" , "Doc2" : { "Serial_No" : "1" , "field4" : "Order" , "field5" : "ABC_1234"} , "Aggregation_Status" : "Submitted"}}}

对于 311 条记录

{ "aggregatedObject" : { "aggregatedObject" : { "aggregatedObject" : { "aggregatedObject" : { "_id" : "Order_REC16904427" , "Status" : "PROCESSING" , "Doc1" : { "field1" : "ABCS57829" , "field2" : "XYZ" , "AmtValue" : 9000.0 , "field3" : "AAAABCD" , "Doc2" : { "Serial_No" : "1" , "field4" : "Order" , "field5" : "ABC_1234"} , "Aggregation_Status" : "Submitted"}}}}}

【问题讨论】:

  • 你尝试过使用 MongoCollection 的 mapReduce 方法吗? eventsCollection.mapReduce(map, reduce);
  • 您发布的代码不足; MapReduceCommand 引用了一些变量,如果您能展示这些变量是如何实现的以及 map-reduce 操作试图解决什么问题(集合中的示例文档和预期输出),那将是最有帮助的。
  • @yoooshi: cmd = new MapReduceCommand(eventsCollection,map,reduce,null,MapReduceCommand.OutputType.INLINE, complexquery); MapReduceOutput out = eventsCollection.mapReduce(cmd);
  • @chridam 添加了缺少的信息,JavaScript 错误我能够解决并能够处理超过 100 个文档,但是由于 Map Reduce 在一个块中需要 100 条记录,如果我尝试处理超过100 条记录我的结果文档以嵌套形式出现,就像在问题中添加的一样

标签: mongodb mapreduce mongodb-query


【解决方案1】:

基本上,MongoDB 支持不超过 100 级的 BSON 文档嵌套。

This discussion 与您面临的问题相同。我猜可能会有所帮助。)

【讨论】:

  • 此链接可能也有帮助:2.4.5 Map Reduce Concurrency 查找 2.4.5 Map Reduce Concurrency 在操作期间,map-reduce 获取以下锁: • 读取阶段需要读锁。它产生每 100 个文档
猜你喜欢
  • 2017-12-23
  • 1970-01-01
  • 2023-03-06
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 2016-11-16
  • 1970-01-01
相关资源
最近更新 更多