我想创建搜索功能,使用couchdb视图搜索包含特定标签的所有文档。
假设我有以下文件:
{
"_id": "1",
"tags": ["abc", "acb", "abd"]
}
{
"_id": "2",
"tags": ["abc", "acb"]
}
我的地图功能:
function(doc) {
for(var idx in doc.tags)
emit(doc.tags[idx], doc._id)
}
当我想查找包含以ab
开头的标签的所有文档时,我可以使用查询参数?startkey="ab"&endkey="ab\u0999"
,并返回couchdb
{"total_rows":5,"offset":0,"rows":[
{"id":"1","key":"abc","value":"1"},
{"id":"2","key":"abc","value":"2"},
{"id":"1","key":"abd","value":"1"}
]}
如何制作reduce函数,所以couchdb会从我的视图中返回唯一的id?
答案 0 :(得分:3)
您不应该在reduce
函数中执行此操作,因为您无法限制生成的id-s集的大小。无论如何,reduce函数仅在您的计算“可重用”时才有用。它不使用查询参数计算任何内容(例如startkey
和endkey
),查询只需要减少输出之前的输出。在这种情况下,键的范围是任意的,reduce
将不起作用:(
但是,你可以在list function中完成。我认为以下内容应该有效(未经测试):
function(head, req){
var ar = new Array();
// get all the id-s
while(row = getRow()){
ar.push(row.value)
}
// make the result unique
ar = ar.sort().filter(function (e, i, arr) {
return arr.lastIndexOf(e) === i;
});
send(toJSON(ar));
}
它应该为请求的范围生成唯一id-s的JSON数组。请注意,结果的格式不符合CouchDB标准,如果您使用某些高级API,则需要稍微重新格式化结果。