0

我使用以下脚本来拆分和计算字段(mongodb)中逗号分隔值的数据数。但在我的情况下,我有像这样的空值“”,它显示“errmsg”:“异常:reduce -> 还不支持多个”,(这个错误)。如果值不为空,则它可以正常工作。我需要为具有像这样的空值的列工作它[字符:“”]。请帮助。

错误:“errmsg”:“异常:reduce -> 尚不支持多个”,“代码”: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”被发射了两次(对于带有“”的多个文档遵循相同的逻辑),值(在我的示例中)是一个包含两个元素的数组,并且 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 回答