View 从CouchDB视图获取唯一的\u id

View 从CouchDB视图获取唯一的\u id,view,mapreduce,couchdb,View,Mapreduce,Couchdb,我想使用couchdb视图搜索包含特定标记的所有文档的搜索功能 假设我有以下文件: { "_id": "1", "tags": ["abc", "acb", "abd"] } { "_id": "2", "tags": ["abc", "acb"] } 和我的地图功能: function(doc) { for(var idx in doc.tags)

我想使用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?

您不应该在
reduce
函数中执行此操作,因为您无法绑定生成的id-s集的大小。无论如何,reduce函数只有在计算“可重用”时才有用。它不使用查询参数(例如,
startkey
endkey
)计算任何内容,查询只获取之前的reduce输出。在您的情况下,键的范围是任意的,
reduce
将不容易工作:(

但是,您可以在中完成。我认为类似于以下内容应该可以工作(未经测试):


它应该为请求的范围生成唯一id-s的JSON数组。请注意,结果的格式不符合CouchDB标准,如果您使用一些高级API,您将需要重新格式化结果。

您要为单个标记或所有标记获取唯一id-s吗?我要为所有标记获取唯一id
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));
}