如何从CouchDB中仅获取单个请求的某些文档的某些字段?

时间:2016-03-06 12:31:33

标签: couchdb

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

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

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

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

即使您只需要文档中的值的子集,如果您只需要整个文档,然后从该结果中选择所需的值,您可能会发现系统整体性能更好。

要仅获取特定键值对,您需要创建一个视图,该视图具有包含doc ID和doc item name的multipart键的视图条目,并具有相应doc文档的值。

所以你的地图功能看起来像是:

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"}
]}

答案 2 :(得分:0)

您可以使用列表功能(请参阅: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"
  ]
}

list函数需要查看文档,并为每个文档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(']}');
})

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