【发布时间】:2012-09-27 14:58:21
【问题描述】:
我想通过一次调用 CouchDB 来查询特定文档的列表。
使用 SQL 我会做类似的事情
SELECT *
FROM database.table
WHERE database.table.id
IN (2,4,56);
_id 或其他字段在 CouchDB 中执行此操作的秘诀是什么?
【问题讨论】:
标签: sql database couchdb where-in
我想通过一次调用 CouchDB 来查询特定文档的列表。
使用 SQL 我会做类似的事情
SELECT *
FROM database.table
WHERE database.table.id
IN (2,4,56);
_id 或其他字段在 CouchDB 中执行此操作的秘诀是什么?
【问题讨论】:
标签: sql database couchdb where-in
您需要使用视图keysquery parameter 来获取具有指定集合中键的记录。
function(doc){
emit(doc.table.id, null);
}
然后
GET /db/_design/ddoc_name/_view/by_table_id?keys=[2,4,56]
要同时检索文档内容,只需在您的请求中添加 include_docs=True 查询参数即可。
UPD:您可能有兴趣按此引用 ID (2,4,56) 检索文档。默认情况下,CouchDB 会查看“映射”发出的键及其所属的文档。要调整此行为,您可以使用 linked documents 技巧:
function(doc){
emit(doc.table.id, {'_id': doc.table.id});
}
现在请求
GET /db/_design/ddoc_name/_view/by_table_id?keys=[2,4,56]&include_docs=True
将返回带有 id 字段的行,该字段指向包含 2、4 和 56 键的文档以及包含引用文档内容的 doc 字段。
【讨论】:
keys 参数对我来说非常清楚。我刚吃了一个啊哈!片刻。谢谢(ps.“链接文档”链接上的拼写错误)
在 CouchDB Bulk 文档中,API 用于此目的:
curl -d '{"keys":["2","4", "56"]}' -X POST http://127.0.0.1:5984/foo/_all_docs?include_docs=true
【讨论】:
emit(doc._id, doc) 或 emit(doc._id, doc._id) 和 ?include_docs=true 的 view 是否有任何显着的性能差异