0

问题

我有一个文档,其中包含一个_id和一个集合,Answers我正在尝试编写一个 map-reduce 函数来汇总每个 id 的答案总分。

文档

/* 0 */
{
  "_id" : ObjectId("527b6ba88d251d58a18f3f0a"),
  "Answers" : [{
      "Score" : 2
    }, {
      "Score" : 0
    }, {
      "Score" : 2
    }, {
      "Score" : 2
    }]
}

这是 Map-Reduce,我认为阅读文档是正确的

地图

function() {
    this.Answers.forEach(function(val)
    { 
        emit(this._id, val.Score); 
    });
}

也试过这个

function() {

    for (var i = 0; i < this.Answers; i++)
    { 
        emit(this._id, this.Answers[i].Score); 
    }
}

减少

function(key, values) 
{
    return Array.sum(values);
}

我没有收到任何信息,但它似乎正在处理它需要 2-5 秒才能返回。我想我对 map-reduce 不了解。

另外我正在使用 MongoVUE 访问 MongoDB。

编辑

我刚刚通过控制台运行了我的 map reduce 并得到了这个输出

{
        "results" : [ ],
        "timeMillis" : 2506,
        "counts" : {
                "input" : 1655,
                "emit" : 0,
                "reduce" : 0,
                "output" : 0
        },
        "ok" : 1,
}

所以这是我的地图功能不正确我猜因为没有发出任何东西。

编辑 2

使用 mongovue 的输出更新文档

4

2 回答 2

1

在 JavaScript 循环中,添加length属性允许您通过数组中的项目数进行迭代,因此您可以将第二次尝试更改为:

function() {

    for (var i = 0; i < this.Answers.length; i++)
    { 
        emit(this._id, this.Answers[i].Score); 
    }
}

还应该注意的是,您的 reduce 可以每个键运行多次,特别是它可以每 101 行重复一次,从技术上讲,这无关紧要,因为您正在对数组值求和,并且之前的 reduce 值将作为数组元素传递新的 reduce 所以它应该可以正常工作;但是,请记住。

于 2013-11-07T10:45:53.783 回答
1

我认为“this”变量不是您在 map 方法中的 .forEach() 函数中所期望的。试试这个;

function() {
    var row = this;
    this.Answers.forEach(function(val)
    { 
      emit(row._id, val.Score); 
    });
}
于 2013-11-07T14:54:21.860 回答