1

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

4

1 回答 1

3

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

但是,您可以在列表函数中执行此操作。我认为类似以下的东西应该可以工作(未经测试):

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,您将需要重新格式化结果。

于 2013-06-10T13:16:46.433 回答