【问题标题】:Getting unique _id from CouchDB view从 CouchDB 视图中获取唯一的 _id
【发布时间】:2013-06-10 05:25:37
【问题描述】:

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

【问题讨论】:

  • 你想为单个标签或所有标签获取唯一的 id-s?
  • 我想要所有标签的唯一 ID

标签: view mapreduce couchdb


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多