我有一个带有关键字标记的文档数据库。我正在尝试查找(然后计算)彼此一起使用的唯一标签。因此,对于任何给定的标签,我想知道与该标签一起使用了哪些标签。
例如,如果我有一个包含标签的文档,[fruit, apple, plant]
那么当我查询时,[apple]
我应该得到[fruit, plant]
. 如果另一个文档有标签[apple, banana]
,那么我的查询[apple]
将给我[fruit, plant, banana]
。
这是我的地图函数,它发出所有标签及其邻居:
function(doc) {
if(doc.tags) {
doc.tags.forEach(function(tag1) {
doc.tags.forEach(function(tag2) {
emit(tag1, tag2);
});
});
}
}
所以在我上面的例子中,它会发出
apple -- fruit
apple -- plant
apple -- banana
fruit -- apple
fruit -- plant
...
我的问题是:我的 reduce 函数应该是什么?reduce 函数本质上应该过滤掉重复项并将它们组合在一起。
我尝试了许多不同的尝试,但我的数据库服务器(CouchDB)一直给我一个错误:reduce_overflow_error。减产必须收缩得更快。
编辑:我发现了一些似乎有效的东西,但我不知道为什么。我看到reduce函数调用有一个可选的“rereduce”参数。如果我忽略这些特殊情况,它就会停止抛出 reduce_overflow_errors。谁能解释为什么?而且,我应该忽略这些,还是以后会咬我的屁股?
function(keys, values, rereduce) {
if(rereduce) return null; // Throws error without this.
var a = [];
values.forEach(function(tag) {
if(a.indexOf(tag) < 0) a.push(tag);
});
return a;
}