在MONGODB中拆分和计算CSV中的数据时出现问题(在列名称中包含Null值:“”)

时间:2012-09-24 12:08:20

标签: mongodb

我使用以下脚本来分割和计算字段(mongodb)中逗号分隔值的数据数。 但在我的情况下,我有像这样的“”这样的空值,它显示“errmsg”:“例外:减少 - >多个不支持”,(此错误)。 如果value不为null则它正常工作。我需要为列工作它具有null值,如[characters:“”]。善意帮助。

错误: “errmsg”:“例外:减少 - >多个不支持”, “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"
 });`

1 个答案:

答案 0 :(得分: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”:“异常:map调用失败: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);
    } 
}