例如,我有数千个结构相同的文档,例如:
{ "key_1":"value_1", "key_2":"value_2", "key_3":"value_3", ... ... }
我需要从一组已知ID的文档中获取key_1、key_3和key_23。例如,我只需要处理5个文档,而我的数据库包含了几千个文档。每次我都有一组不同的键和文档ID。是否可以从一个请求中获取这些信息?
hmmo2u0o1#
您可以使用列表函数(请参阅:this、这个和这个)。由于您知道id,因此可以使用list函数查询_all_docs:
_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。未测试:
send
(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(']}'); })
我不确定这是否是一个好主意。如果你的文档很大,节省带宽很重要,这可能是个好主意。
i2loujxw2#
是的,这是可能的。你的问题可以分成两个不同的问题:1.仅获取文档的一部分(在您的示例中:key_1、key_3和key_23)。这可以通过视图来完成。视图被保存到设计文档中。有关如何创建视图的更多信息,请参见wiki。1.只检索特定的文档,这些文档是由它们的ID定义的。当查询视图时,你不能只指定一个ID(或者更确切地说是键),还需要一个键数组,这正是你在这里需要的。同样,请参见Wiki中关于查询视图的部分,以获得解释和示例。
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"]等。因此,查询如下:
["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"} ]}
3条答案
按热度按时间hmmo2u0o1#
您可以使用列表函数(请参阅:this、这个和这个)。
由于您知道id,因此可以使用list函数查询
_all_docs
:list函数需要查看文档,并为每个文档
send
相应的JSON。未测试:我不确定这是否是一个好主意。如果你的文档很大,节省带宽很重要,这可能是个好主意。
i2loujxw2#
是的,这是可能的。你的问题可以分成两个不同的问题:
1.仅获取文档的一部分(在您的示例中:key_1、key_3和key_23)。这可以通过视图来完成。视图被保存到设计文档中。有关如何创建视图的更多信息,请参见wiki。
1.只检索特定的文档,这些文档是由它们的ID定义的。当查询视图时,你不能只指定一个ID(或者更确切地说是键),还需要一个键数组,这正是你在这里需要的。同样,请参见Wiki中关于查询视图的部分,以获得解释和示例。
egmofgnx3#
即使您只需要文档中的值的子集,您也会发现,如果您只请求整个文档,然后从结果中选择所需的值,系统作为一个整体的性能会更好。
要只获取特定的键值对,您需要创建一个视图,该视图包含具有多部分键的视图条目,该多部分键由文档ID和文档项名称组成,并具有相应文档项的值。
因此,您的map函数看起来如下所示:
然后,您可以使用多键查找,其中每个键的格式为
["docid12345", "key_1"]
、["docid56789", "key_23"]
等。因此,查询如下:
将返回