-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

私の map と reduce 関数は次のとおりです。

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 関数から同じ形式を返していないことです。reduce 関数はキーごとに 0 回、1 回、または複数回呼び出すことができるため、すべての場合でまったく同じ形式を使用する必要があり、reduce 関数が 1 回だけ呼び出されると想定することはできません。

于 2013-05-31T03:34:53.960 に答える
0

Javascript 配列は 0-index です。したがって、最後の実行では、存在しない配列インデックスにアクセスしたいと考えています。あなたのコードが正しく解釈されることを願っています。

[...]

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し、その間に減少する無限ループが発生しないことを確認しますか?

于 2013-05-23T16:05:01.600 に答える