例如,我有数千个具有相同结构的文档,例如:
{
"key_1":"value_1",
"key_2":"value_2",
"key_3":"value_3",
...
...
}
我需要获取,让我们说一些具有已知ID的文档中的key_1,key_3和key_23,例如,我需要处理5个文档而我的数据库包含数千个文档。每次我有一组不同的密钥和文档ID。是否有可能获得一个请求的信息?
答案 0 :(得分:0)
是的,这是可能的。您的问题可以分解为两个不同的问题:
仅获取文档的一部分(在您的示例中:key_1,key_3和key_23)。这可以使用视图完成。视图将保存到设计文档中。 See the wiki了解有关如何创建视图的详细信息。
仅检索由其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)
您可以使用列表功能(请参阅:this,this和this)。
由于您知道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(']}');
})
这是否是一个好主意,我不确定。如果您的文档很大,并且带宽节省很重要,那么可能会。