错误(Reducer:)尝试进行明显的reduce时

时间:2015-07-01 04:30:48

标签: couchbase couchbase-view

尝试执行从here获得的DISTINCT减少时出错。我在啤酒样品桶上重现了这个错误,所以这应该很容易重现。我没有在#include <vector> #include <iostream> #include <algorithm> void print(const std::vector<int> & v) { std::cout<<"("; for(auto x=v.begin(); x!=v.end(); ++x) { std::cout<<*x<<","; } std::cout<<")"; } void print(const std::vector<std::vector<int>> & v) { std::cout<<"("; for(auto x=v.begin(); x!=v.end(); ++x) { print(*x); std::cout<<","; } std::cout<<")"<<std::endl; } int main() { std::vector<std::vector<int>> v { {0,100,17,2}, {2,3,1,3}, {9,92,81,8}, {0,92,92,91}, {0,92,92,91}, {10,83,7,2}, {1,2,3,3} }; print(v); std::sort(v.begin(), v.end()); print(v); std::vector<int> key = { 0,100, 17, 2 }; auto it = std::lower_bound(v.begin(), v.end(), key); if(it!=v.end() && key==*it) { std::cout<<"Found it"<<std::endl; } else { std::cout<<"Not found"<<std::endl; } } 文件中看到任何错误,也没有看到任何会导致我在其他文件中的错误。 (如果您希望我搜索或发布其他文件的片段,请询问)。

在Windows 2008 R2上运行couchbase enterprise 4 beta(这也发生在3.0.1社区版本上。)。

这是我的地图功能(使用啤酒样本桶,直接与couchbase一起发货)。

mapreduce_errors.txt

这是我的reduce函数:

function(doc, meta) {
  switch(doc.type) {
  case "brewery":
    emit(meta.id);
    break;
  }
}

这是错误:

  

原因:错误(减速机:)

如果它有帮助,也是视图页面的一部分:http://i.imgur.com/KyLutMc.png

2 个答案:

答案 0 :(得分:1)

问题出在你的自定义缩减功能中:当你作为重新缩减的一部分被调用时,你没有处理这种情况。

根据Couchbase documentation

  

reduce()函数的基本格式如下:

function(key, values, rereduce) {
    ...
    return retval;
}
     

reduce函数提供了三个参数:

     

key:关键是从map()函数派生的唯一键   group_level参数。

     

values:values参数是所有匹配值的数组   特别的关键。例如,如果相同的键输出三次,   数据将是包含每个项目的三个项目的数组   包含emit()函数输出的值。

     

rereduce:rereduce表示是否正在调用该函数   作为重新减少的一部分,即调用reduce函数   再次进一步减少输入数据。

     

rereduce为假时:

     
      
  • 提供的key参数将是一个数组,其中第一个参数是map函数发出的keyid是生成的keys文档ID键。

  •   
  • 值是一个值数组,其中数组的每个元素与rereduce数组中的对应元素匹配。

  •   
     

key为真时:

     
      
  • values将为空。

  •   
  • reduce()将是前一个keys函数返回的值数组。该函数应返回简化版本   通过调用return()函数来获取信息。格式   返回值应与指定键所需的格式匹配。

  •   

大胆的格式是我的,突出显示的单词非常重要:您应该考虑有时候,您会收到值为null的{​​{1}}参数。

根据文档,您应该在rereduce函数中truereduce()时处理此案例,并且您应该知道在这种情况下,keys将是null。对于reduce()函数,您可以执行以下操作:

function(keys, values, rereduce) {
  if (rereduce) {
    var result = [];
    for (var i = 0; i < values.length; i++) {
      var distinct = values[i];
      for (var j = 0; j < distinct.length; j++) {
        result.push(distinct[j]);
      }
    }
    return result.filter(function (e, i, arr) {
      return arr.lastIndexOf(e) === i;
    });
  }

  return keys.filter(function (e, i, arr) {
    return arr.lastIndexOf(e) === i;
  });
}

在这里,我首先处理重新减少阶段。为此,我将我在values参数中收到的数组数组展平,然后删除合并后可能出现的重复项。

然后是你的原始代码,它返回keys参数数组,没有重复。

为了测试这个reduce()函数是否真的有效,我使用了以下map()函数:

function(doc, meta) {
  switch(doc.type) {
  case "brewery":
    emit(meta.id, null);
    emit(meta.id, null);
    break;
  }
}

这故意生成重复项,然后由reduce()函数删除。

答案 1 :(得分:0)

虽然此reduce用作开发视图,但它不作为生产视图。数据集必须太大,因此您必须实施rereduce。该文档应该有助于http://docs.couchbase.com/admin/admin/Views/views-writing.html#reduce-functions