MongoDB Map - 不完全减少结果

时间:2013-09-21 08:13:18

标签: mongodb mapreduce

我在MongoDB中有数据结构,如下所示

{
    "_id" : ObjectId("523aab00045624a385e5f549"),
    "name" : "English Book 29",
    "SKU" : 1000549081,
    "price" : 249000,
    "image" : null,
    "category_id" : ObjectId("523a7802b50418baf38b4575"),
    "category_name" : "English Book",
    "details" : {
        "Title" : "Title 549081",
        "Binding" : 1,
        "Author" : "Author 0",
        "Publication data" : 0.5263832447608386,
        "Publisher name" : "Publisher name 14",
        "Number of page" : 90
    }
}

书的装订有2个值: 0表示软绑定,1表示硬绑定。我将Map Reduce写入每个值的统计数据。

var map = function()
{
  for(var key in this.details)
  {
    if(key == 'Binding')
    { 
        emit({name: key}, {
          'data':
          [
            {
              name: this.details[key],
              count: 1
            }
          ]
        });      
    }
  }
};

var reduce = function (key, values) {
  var reduced = {};
  for(var i in values)
  {
    var inter = values[i];
    for(var j in inter.data)
    {
      if(typeof(reduced[inter.data[j].name]) != "undefined")
      {
        reduced[inter.data[j].name] += inter.data[j].count;
      }
      else
      {
        reduced[inter.data[j].name] = 1;
      }
    }
  }
  return reduced;
};

当我使用小数据(50条记录)运行时,结果完全返回。但是当我用真实数据(192000记录)运行它时结果返回不完全。结果如下

{
    "_id" : {
        "name" : "Binding"
    },
    "value" : {
        "0" : 50,
        "1" : 50
    }
}

我在完成Map / Reduce时检查了返回数据,结果如下

"counts" : {
        "input" : 192000,
        "emit" : 192000,
        "reduce" : 1920,
        "output" : 1
    },

它有什么问题。欢迎任何建议,解释。 谢谢和最诚挚的问候,

1 个答案:

答案 0 :(得分:0)

昨天研究了Map / Reduce之后,我意识到,“Emit”一次发送100个元素,并且“Reduce”在这个数据集上执行。所以我上面的代码是错误的,因为它只对小数据集“SUM”。 下面是我的Map-Reduce新代码

var map = function ()
{
    for(var key in this.details)
    {
        if(key == 'Binding')
        {
            var value = {};
            value[this.details[key]] = 1;
            emit(key, value);
        }
    }
}

var reduce = function (key, values)
{
    var reduced = {};
    for(var idx = 0; idx < values.length; idx++)
    {
        var inner = values[idx];
        for (var j in inner)
        {
            if (typeof (reduced[j]) == 'undefined')
            {
                reduced[j] = 0;
            }
            reduced[j] += inner[j];
        }
    }
    return reduced;
}

我在这里发布任何遇到类似情况的人。谢谢你的阅读。