Tôi nghĩ rằng tôi đã phát hiện ra vấn đề. Xem xét dữ liệu đầu vào sau:
{_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"
Thông báo lỗi này chỉ ra rằng MR hiện không thể được sử dụng để trả về một mảng giá trị. Nếu bạn nhìn vào chức năng giảm của mình:
reduce = function(key, values) {
return values;
}
"giá trị" sẽ là một mảng "array.length" được nhóm lại với nhau bằng khóa. Vì khóa "a, b, c" được phát ra hai lần (cùng một logic theo sau cho nhiều tài liệu có ""), các giá trị (trong ví dụ của tôi) là một mảng có hai phần tử và MR không thể trả về mảng.
Nếu một tài liệu được phát ra cho một khóa cụ thể (trường hợp của _id:1), thì hàm giảm sẽ không được gọi. Điều này giải thích tại sao bạn không nhận được thông báo lỗi khi bạn không phát ra các ký tự rỗng.
Để thao tác MR này hoạt động, bạn cần tạo một tài liệu duy nhất cho {ký tự:""}. Nếu bạn cung cấp thêm thông tin về dữ liệu của mình, chúng tôi có thể giúp tìm ra các giải pháp thay thế.
CHỈNH SỬA:
Hàm giảm sau đây sẽ đảm bảo rằng một giá trị duy nhất, thay vì một mảng, được trả về:
reduce = function(key, values) {
return values[0];
}
CHỈNH SỬA 2:
Để tránh lỗi, "errmsg":"exception:map gọi không thành công:JS Lỗi:TypeError:this.characters không có thuộc tính nào nofile_b:1", "code":9014 ...
map = function() {
if (this.characters != null){
var array = this.characters.split(',');
emit(this.characters, array.length);
}
}