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

x759pob2  于 2022-12-09  发布在  CouchDB
关注(0)|答案(3)|浏览(169)

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

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

我需要从一组已知ID的文档中获取key_1、key_3和key_23。例如,我只需要处理5个文档,而我的数据库包含了几千个文档。每次我都有一组不同的键和文档ID。是否可以从一个请求中获取这些信息?

hmmo2u0o

hmmo2u0o1#

您可以使用列表函数(请参阅:this、这个和这个)。
由于您知道id,因此可以使用list函数查询_all_docs

POST /{db}/_design/{ddoc}/_list/{func}/_all_docs?include_docs=true&columns=["key_1","key_2","key_3"]
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 columns) {
            doc[k] = row.doc[k];
        }
        row.doc = doc;
        send(delim + toJSON(row));
        delim = ',';
    }

    send(']}');
})

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

i2loujxw

i2loujxw2#

是的,这是可能的。你的问题可以分成两个不同的问题:
1.仅获取文档的一部分(在您的示例中:key_1、key_3和key_23)。这可以通过视图来完成。视图被保存到设计文档中。有关如何创建视图的更多信息,请参见wiki。
1.只检索特定的文档,这些文档是由它们的ID定义的。当查询视图时,你不能只指定一个ID(或者更确切地说是键),还需要一个键数组,这正是你在这里需要的。同样,请参见Wiki中关于查询视图的部分,以获得解释和示例。

egmofgnx

egmofgnx3#

即使您只需要文档中的值的子集,您也会发现,如果您只请求整个文档,然后从结果中选择所需的值,系统作为一个整体的性能会更好。
要只获取特定的键值对,您需要创建一个视图,该视图包含具有多部分键的视图条目,该多部分键由文档ID和文档项名称组成,并具有相应文档项的值。
因此,您的map函数看起来如下所示:

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

相关问题