【问题标题】:How to get from CouchDB only certain fields of certain documents for a single request?如何从 CouchDB 仅获取单个请求的某些文档的某些字段?
【发布时间】:2016-03-11 21:39:44
【问题描述】:

例如,我有数千个具有相同结构的文档,例如:

{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3",
...
...
}

我需要从一组具有已知 ID 的文档中获取 key_1、key_3 和 key_23,例如,我只需要处理 5 个文档,而我的数据库包含数千个文档。每次我有一组不同的密钥和文档 ID。是否有可能为一个请求获取该信息?

【问题讨论】:

  • 你知道 doc_id 第一手资料吗?这意味着您要从 doc_id 列表中检索 5 个文档,然后为每个文档提取键。

标签: couchdb


【解决方案1】:

您可以使用列表函数(请参阅:thisthisthis)。

既然知道id,就可以用list函数查询_all_docs

POST /{db}/_design/{ddoc}/_list/{func}/_all_docs?include_docs=true&columns=["key_1","key_2","key_23"]
Accept: application/json
Content-Length: {whatever}

{
  "keys": [
    "docid002",
    "docid005"
  ]
}

列表函数需要查看文档,send 需要为每个文档设置适当的 JSON。未测试:

(function (head, req) {
    send('{"total_rows":' + head.total_rows + ',"offset":' + head.offset + ',"rows":[');

    var columns = JSON.parse(req.query.columns);
    var delim = '';

    var row;
    while (row = getRow()) {
        var doc = {};
        for (var k in row.doc) {
            doc[k] = row.doc[k];
        }
        row.doc = doc;
        send(delim + toJSON(row));
        delim = ',';
    }

    send(']}');
})

这是否是个好主意,我不确定。如果您的文档很大,并且节省带宽很重要,它可能会。

【讨论】:

    【解决方案2】:

    是的,这是可能的。您的问题可以分为两个不同的问题:

    1. 仅获取文档的一部分(在您的示例中:key_1、key_3 和 key_23)。这可以使用视图来完成。视图被保存到设计文档中。 See the wiki 了解有关如何创建视图的更多信息。

    2. 仅检索由其 ID 定义的特定文档。查询视图时,您不仅可以指定单个 ID(或者更确切地说是键),还可以指定一组键,这正是您在此处需要的。同样,请参阅 wiki 中的 section on querying views 以获取解释和示例。

    【讨论】:

      【解决方案3】:

      即使您只需要文档中的一部分值,您可能会发现,如果您只要求整个文档然后从该结果中选择您需要的值,系统作为一个整体的性能会更好。

      要仅获取特定的键值对,您需要创建一个视图,该视图的视图条目具有由文档 ID 和文档项名称组成的多部分键,以及相应文档项的值。

      所以你的地图函数看起来像:

      function(doc){
          for(var i = 1; i < doc.keysInDoc; i++){
              var k = "key_"+i;
              emit([doc._id,  k], doc.[k]);
          }
      }
      

      然后您可以使用多键查找,每个键的格式为 ["docid12345", "key_1"]["docid56789", "key_23"] 等。

      所以这样的查询:

      http://host:5984/db/_design/design/_view/view?&keys=[["docid002","key_8"],["docid005","key_7"]]
      

      会回来

      {"total_rows":84,"offset":67,"rows":[
      {"id":"docid002","key":["docid002","key_8"],"value":"value d2_k8"},
      {"id":"docid005","key":["docid005","key_12"],"value":"value d5_k12"}
      ]}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-31
        • 2022-10-01
        • 1970-01-01
        • 2014-01-06
        • 2020-08-30
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        相关资源
        最近更新 更多