在 CouchDB 中执行 WHERE - IN 查询

Posted

技术标签:

【中文标题】在 CouchDB 中执行 WHERE - IN 查询【英文标题】:Performing a WHERE - IN query in CouchDB 【发布时间】:2012-09-27 14:58:21 【问题描述】:

我想通过一次调用 CouchDB 来查询特定文档的列表。

使用 SQL 我会做类似的事情

SELECT *
FROM database.table
WHERE database.table.id
IN (2,4,56);

_id 或其他字段在 CouchDB 中执行此操作的秘诀是什么?

【问题讨论】:

【参考方案1】:

您需要使用视图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 字段的行,该字段指向包含 2456 键的文档以及包含引用文档内容的 doc 字段。

【讨论】:

在 url 中使用 keys 参数对我来说非常清楚。我刚吃了一个啊哈!片刻。谢谢(ps.“链接文档”链接上的拼写错误)【参考方案2】:

在 CouchDB Bulk 文档中,API 用于此目的:

curl -d '"keys":["2","4", "56"]' -X POST http://127.0.0.1:5984/foo/_all_docs?include_docs=true

http://wiki.apache.org/couchdb/HTTP_Bulk_Document_API

【讨论】:

另外,您知道批量文档 API 与编写发出 emit(doc._id, doc)emit(doc._id, doc._id)?include_docs=trueview 是否有任何显着的性能差异 是的,这适用于 ID,这是正确的。据我所知 _all_docs 也是一个视图,所以性能上应该没有区别。

以上是关于在 CouchDB 中执行 WHERE - IN 查询的主要内容,如果未能解决你的问题,请参考以下文章

ruby 在一个查询中执行“where in”

使用 MySQLdb 执行“SELECT ... WHERE ... IN ...”

在 Doctrine 2 中执行 WHERE .. IN 子查询

在Doctrine 2中执行WHERE .. IN子查询

mysql中on,in,as,where如何用,意思是啥?

使用 Spark 执行“WHERE IN”子句,如何仅重新训练第一个数据集的列?