【问题标题】:Struggling with a map-reduce in MongoDb在 MongoDb 中与 map-reduce 作斗争
【发布时间】:2013-11-07 22:54:21
【问题描述】:

问题

我有一个包含 _idAnswers 集合的文档我正在尝试编写一个 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 的输出更新文档

【问题讨论】:

  • 我正在尝试学习 map-reduce,所以我将其用作我的测试数据。我知道聚合框架通常可能更适合。
  • 它根本不发射,我同意它应该是,我只能认为你的架构不是你想象的那样,虽然第二段代码有语法错误,但应该是:for (var i = 0; i &lt; this.Answers.length; i++)
  • 我已经更新了从集合的 mongoview 文本视图中剪切和粘贴的文档。
  • 你能试试 for 循环的第二个版本,但我声明的改变是?
  • 这就是问题所在:S 显然已经看得太久了。作为答案

标签: mongodb mapreduce


【解决方案1】:

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

function() {

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 2021-01-15
      • 2022-01-08
      • 2013-12-06
      • 2019-04-20
      • 1970-01-01
      相关资源
      最近更新 更多