令人费解的“减少太大”的错误

时间:2016-01-14 16:54:59

标签: mapreduce couchbase

我有一个文件桶,格式如下:

{
  "a": 1,
  "b": 2,
  "c": 3,
  "d": 4,
  "e": 5
}

这是我的映射功能:

function (doc, meta) {
  var summary = {
    b: doc.b,
    c: doc.c,
    history: [{
      d: doc.d,
      e: doc.e
    }]
  };
  emit(doc.a, summary);
}

这是我的缩减功能:

function(key, values, rereduce) {
  for (i = 1; i < values.length; ++i)
    Array.prototype.push.apply(values[0].history, values[i].history);
  return values[0];
}

最后,这是我的查看查询参数:

?stale=false&group=true&reduce=true

此组合会导致reduction too large错误。现在,我的数据集中最多有两个相同的键,所以我可以将reduce函数更改为:

function(key, values, rereduce) {
  if (values[1])
    Array.prototype.push.apply(values[0].history, values[1].history);
  return values[0];
}

保持其他一切相同,我得到了我想要的确切结果:

{  
   "key":1,
   "value":{  
      "b":2,
      "c":3,
      "history":[  
         {  
            "d":4,
            "e":5
         },
         {  
            "d":6,
            "e":7
         }
      ]
   }
}, many more like this

但是,我希望密钥的数量随着时间的推移而增长,因此我需要能够遍历values

我还将我的reduce函数更改为只返回values.length以检查它是否返回了不合理的值,但我得到的只是12

发生了什么事?

更新

当我将reduce函数更改为:

function(key, values, rereduce) {
  if (rereduce) return "whatisgoingon";
  for (i = 1; i < values.length; ++i)
    Array.prototype.push.apply(values[0].history, values[i].history);
  return values[0];
}

我得到了我想要的结果,但是在视图结果中找不到whatisgoingon。我不想“丢弃”rereduce逻辑,因为我将来可能会实际使用它,所以我需要了解问题的原因。

0 个答案:

没有答案