我有文档和视图,您可以在其中按关键字列表进行搜索。文档可能如下所示:
{
_id: "foo",
keywords: ["bar", "baz"],
}
然后,我有了观点:
map: function (doc) {
doc.keywords.forEach(function(word) {
emit(word, doc);
});
}
这很有效,因为我收到了foo
文档,但问题是如果我没有提供密钥,我会两次获得此文档,因为它有两个关键字。但是,我只需要/想要一次文件。
我还添加了
reduce: function (key, value, rereduce) {
return value;
}
但这给了我reduce_overflow_error
。如果我使用return null
,那么我获得的文档值为null
,这也不好。
我也读过有关使用列表功能的内容,但我不确定 list 函数应该放在couchapp中的哪个位置。对于我认为应该相当简单的事情,这似乎也很复杂。
如何在查询视图时停止重复操作?
答案 0 :(得分:0)
我发现您的查询令人困惑,但让我帮您解决错误。
在reduce函数中,您有多个值(即具有相同键的文档数组)。因此,如果您重写下面的reduce函数,您将得到一个关键字索引,每个关键字只有一个文档,但是简化文档不再链接到原始文档。
function (key, values, rereduce){
return values[0];
}
如果您的用例是为每个关键字计算文档数量,则将其写为:
function (key, values, rereduce){
if (rereduce){
var sum = 0;
for (i=0; i< values.length(); i++){
sum = sum + values[i];
}
return sum;
}
return values.length();
}
在您希望索引项引用包含该键的文档的任何情况下,都不能使用reduce函数。