6

尝试从这里得到的 DISTINCT 减少时出现错误。我已经在啤酒样品桶上重现了这个错误,所以这应该很容易重现。我没有在mapreduce_errors.txt文件中看到任何错误,也没有看到任何会导致我在其他文件中出现的任何错误。(如果您希望我搜索或发布其他文件的片段,请询问)。

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

这是我的地图功能(使用直接与沙发底座一起提供的啤酒样品桶)。

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

这是我的减少功能:

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

这是错误:

原因:错误(减速机:)

如果有帮助,也是查看页面的 imgur:http: //i.imgur.com/KyLutMc.png

4

2 回答 2

1

问题出在您的自定义 reduce 函数中:当它作为 re-reduce 的一部分被调用时,您没有处理这种情况。

根据Couchbase 文档

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

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

reduce 函数提供了三个参数:

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

values: values 参数是与特定键匹配的所有值的数组。例如,如果相同的键被输出 3 次,则 data 将是一个包含三个项目的数组,其中每个项目都包含 emit() 函数输出的值。

rereduce:rereduce 指示函数是否作为re-reduce 的一部分被调用,即再次调用reduce 函数以进一步减少输入数据。

何时rereduce为假:

  • 提供的key参数将是一个数组,其中第一个参数是 keymap 函数发出的 ,而id是生成密钥的文档 ID。

  • 这些值是一个值数组,其中数组的每个元素都与 的数组中的相应元素匹配keys

何时rereduce为真:

  • key将为空。

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

粗体格式是我的,突出显示的单词非常重要:您应该考虑有时,您会收到keys值为null.

根据文档,您应该在函数内处理这种情况rereducetrue并且reduce()您应该知道在这种情况下,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()函数将其删除。

于 2015-07-12T02:49:32.107 回答
0

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

于 2015-07-01T13:57:29.777 回答