【发布时间】:2011-03-09 15:09:11
【问题描述】:
我有一个带有视图的 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]);
}
【问题讨论】: