-1

出现以下错误

Thu May 23 07:14:53.437 JavaScript execution failed: map reduce failed:{
    "errmsg" : "exception: JavaScript execution failed: TypeError: Cannot read property 'product_category' of undefined near '(values[i].product_category)'  (line 21)",
    "code" : 16722,
    "ok" : 0
 at src/mongo/shell/collection.js:L970

我的地图和减少功能是:

map1 = function()
{ 
   emit({Product_id:this.Product_id
}, 
{
   product_category:this.product_category
}); 
}

reduce1 = function(key, values)
{
var ref = new Array();
var count = 0;
var tmp="";
var pdt_array = new Array();
for (var i = 1; i <= values.length; i++) {                                 
if( i == 1 )
{
     pdt_array_array[i] = values[i];
} 
else
{                     
    tmp = values[i];
    while(i > 1)
    {
        if(tmp == pdt_array[i])
        {
            ref.push(values[i].product_category);
            count++;
        }
        i--;

    }
    pdt_array[i] = tmp;
    tmp = "";
}
}
   return {product_category:ref, Count:count}
}

db.DummyReverse.mapReduce(map1, reduce1, {out:{reduce:"product_count_while"}})
4

2 回答 2

2

问题是您从 reduce 函数返回的格式与您作为值发出的格式不同。由于可以为每个键调用 0、一次或多次reduce 函数,因此在所有这些情况下您必须使用完全相同的格式,并且您不能假设您的reduce 函数只会被调用一次。

于 2013-05-31T03:34:53.960 回答
0

Javascript 数组是 0 索引的。所以你最后一次运行想要访问一个不存在的数组索引。我希望我能正确解释您的代码。

[...]

for (var i = 0; i < values.length; i++) {                                 
    if ( i == 0) {
         pdt_array_array[i] = values[i];
    } else {                     
        tmp = values[i];

        while(i > 0) {
            if(tmp == pdt_array[i]) {
                ref.push(values[i].product_category);
                count++;
            }

            i--;
        }

        pdt_array[i] = tmp;
        tmp = "";
    }
}

[...]

请注意for (var i = 0; i < values.length; i++)。所以第n个元素有索引n-1。最后一个元素length-1

备注:你确定你没有无限循环,for循环增加i而while减少吗?

于 2013-05-23T16:05:01.600 回答