我有一个CouchDB数据库,其视图的值是[x,y]形式的配对数字。对于具有相同密钥的文档,我需要(同时)计算x的最小值和y的最大值。我正在使用的数据库包含大约50000个文档。构建视图需要几个小时,这似乎有些过分。 (键本身是长度为三个数组。)我在下面显示地图和减少功能,但基本问题是:如何加快这个过程?
请注意,内置函数不起作用,因为值必须是数字,而不是长度为两个数组。我可以制作两个不同的视图(一个用于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]);
}
答案 0 :(得分:2)
还有两个笔记。使用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将值视为字符串,那是因为您将它们作为字符串存储在文档中。
希望它有所帮助。
答案 1 :(得分:1)
这结果是两个因素的组合。在上面发布的代码中很明显,当使用“return”时使用“emit”。
另一个因素不太明显,只能通过制作较小版本的数据库并记录reduce函数中的步骤来找到。虽然“值”中的条目是整数,但它们被CouchDB视为字符串。使用parseInt函数纠正了这个问题。
在这两个修复之后,缩小视图的整个构建大约花了五分钟,因此速度问题消失了。
答案 2 :(得分:0)
请检查http://www.geeksforgeeks.org/archives/4583。这可以扩展到您的应用程序。