我有一个包含156个json文档的couchdb数据库。我想在文档中找到特定值的最大值,然后发出包含该最大值的整个文档。我使用了这段代码,但似乎没有用。这可以帮助您理解我的意思。
function(doc) {
var i,m;
for (i = 0; i < doc.watchers.length; i++)
m = Math.max(m,doc.watchers[i]);
for (i = 0; i < doc.watchers.length; i++)
if (m = doc.watchers[i])
emit(doc.watchers[i], doc.watchers);
}
我还想选择具有最大值的2个顶级文档。
答案 0 :(得分:0)
仅使用地图功能将无法正常工作,因为map / reduce的工作方式无法同时为地图功能提供完整的键和值集。 我会使用reduce函数。像这样:
地图功能
function(doc) {
var i,m;
for (i = 0; i < doc.watchers.length; i++) {
emit([doc._id, doc.watchers[i]], doc.watchers);
}
}
减少功能
function(keys, values) {
var top=0;
var index=0;
for (i=0;i<keys.length;i++) {
if (keys[i][1] > top) {
top = keys[i][1];
index = i;
}
}
return({keys[index], values[index]})
}
要使此策略起作用,您需要使用group_level = 1进行查询,以便沙发将按文档ID分组的结果传递给map函数。 我还没有测试过这个解决方案,但它还没有解决你的第二个问题。如果你认为它是正确的,我可以改进它。