0

次のスクリプトを使用して、フィールド(mongodb)のコンマ区切り値のデータ数を分割してカウントしました。しかし、私の場合、この "" のような null 値があります。これには "errmsg" が表示されます: "exception: reduce -> multiple not supported yet",(このエラー)。値が null でない場合は、適切に機能します。この [characters:""] のように列に null 値がある場合は、それを機能させる必要があります。親切に助けてください。

エラー: "errmsg": "例外: reduce -> 複数はまだサポートされていません"、"code": 10075、"ok": 0

enter code here
map = function() {
var array = this.characters.split(',');
emit(this.characters, array.length);
}

reduce = function(key, values) {
return values;
}

result = db.runCommand({
    "mapreduce" : "book", 
    "map" : map,
    "reduce" : reduce,
    "out" : "comma_result"
 });`
4

1 に答える 1

1

私は問題を発見したと思います。次の入力データを検討してください。

{_id: 1, characters: ""}
{_id: 2, characters: "a, b, c"}
{_id: 3, characters: "a, b, c"}

> db.collection.mapReduce(map, reduce, {out: { inline : 1}})
"exception: reduce -> multiple not supported yet"

このエラーメッセージは、現在MRを使用して値の配列を返すことができないことを示しています。あなたがあなたのreduce機能を見てみると:

reduce = function(key, values) {
    return values;
}

「values」は、キーでグループ化された「array.length」の配列になります。キー「a、b、c」が2回発行されたため(「」を含む複数のドキュメントに対して同じロジックが続きます)、値(私の例では)は2つの要素を持つ配列であり、MRは配列を返すことができません。

特定のキーに対して単一のドキュメントが発行された場合(_id:1の場合)、reduce関数は呼び出されません。これは、ヌル文字を出力しないときにエラーメッセージが表示されない理由を説明しています。

このMR操作を機能させるには、{characters:""}の単一のドキュメントを発行する必要があります。データに関する追加情報を提供すると、回避策を見つけるのに役立つ場合があります。

編集:

次のreduce関数は、配列ではなく単一の値が返されるようにします。

reduce = function(key, values) {
        return values[0];
}

編集2:

エラーを防ぐために、 "errmsg": "例外:マップの呼び出しに失敗しました:JSエラー:TypeError:this.charactersにはプロパティがありませんnofile_b:1"、 "code":9014 .. ..

map = function() { 
    if (this.characters != null){ 
         var array = this.characters.split(','); 
         emit(this.characters, array.length);
    } 
}
于 2012-09-24T15:51:58.117 に答える