私は問題を発見したと思います。次の入力データを検討してください。
{_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 = 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);
}
}