【发布时间】: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