我有一个CouchDB数据库,其视图的值是[x,y]形式的成对数字。对于具有相同键的文档,我需要(同时)计算x的最小值和y的最大值。我正在使用的数据库包含大约50000个文档。构建视图需要几个小时,这似乎有些多余。 (键本身是三个长度的数组。)我在下面显示了map和reduce函数,但是基本的问题是:如何加快此过程?

请注意,内置函数将不起作用,因为值必须是数字,而不是长度为2的数组。我可能会做出两种不同的视图(一个用于min(x),一个用于max(y)),但是我不清楚如何组合它们以同时获得两个结果。

我目前的地图功能基本上像

function(doc) {
  emit ([doc.a, doc.b, doc.c], [doc.x, doc.y])
}


我的reduce函数看起来像

function(keys, values) {
  var x = null;
  var y = null;
  for (i = 0; i < values.length; i++) {
    if (values[i][0] == null) break;
    if (values[i][1] == null) break;
    if (x == null) x = values[i][0];
    if (y == null) y = values[i][1];
    if (values[i][0] < x) x = values[i][0];
    if (values[i][1] > y) y = values[i][1];
  }
  emit([x, y]);
}

最佳答案

再加上两个音符。使用Math.max()和Math.min()应该更快一些。

function(keys, values) {
  var x = -Infinity,
      y = Infinity;
  for (var i = 0, v; v = values[i]; i++) {
    x = Math.max(x, v[0]);
    y = Math.min(y, v[1]);
  }
  return [x, y];
}


而且如果CouchDB将值当作字符串对待,那是因为您将它们作为字符串存储在文档中。

希望能帮助到你。

关于couchdb - 使用CouchDb映射/减少更快的最小和最大不同数组组件的数量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5247758/

10-12 07:21
查看更多