从CouchDB视图中获取唯一的_id

时间:2013-06-10 05:25:37

标签: view mapreduce couchdb

我想创建搜索功能,使用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?

1 个答案:

答案 0 :(得分:3)

您不应该在reduce函数中执行此操作,因为您无法限制生成的id-s集的大小。无论如何,reduce函数仅在您的计算“可重用”时才有用。它不使用查询参数计算任何内容(例如startkeyendkey),查询只需要减少输出之前的输出。在这种情况下,键的范围是任意的,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,则需要稍微重新格式化结果。