使用Couch_Potato进行动态查询

时间:2014-12-18 10:48:21

标签: ruby-on-rails ruby couchdb couchpotato

创建相当简单的视图的文档很容易找到:

view :completed, :key => :name, :conditions => 'doc.completed === true'

但是,如何使用动态创建的条件构建视图?例如,如果我想使用

行的查询
doc.owner_id == my_var

以编程方式设置my_var。

这甚至可能吗?我对NoSQL很新,所以如果我没有意义,请道歉。

1 个答案:

答案 0 :(得分:1)

在将数据插入/更新到特定数据库时,会逐步构建/索引CouchDB中的视图。因此,为了充分利用视图背后的功能,您不希望动态查询它们。您希望以这样一种方式构建视图,以便您可以根据应用程序的预期使用模式高效地访问数据。根据我的经验,多个视图各自为您提供访问/查询相同数据的不同方式并不罕见。我认为将CouchDB视图视为一种系统地反规范化文档的方法很有帮助。

另一方面,还有一些方法可以在视图中推广索引,这样您就可以使用单个视图来查看无穷无尽的查询组合。

例如,你有一篇"文章"数据库,每篇文章文档都包含一个标签列表。如果要设置查询以动态检索标记有少量标记的所有文章,则可以在同一文档的视图中发出多个条目:

// this article is tagged with "tag1","tag2","tag3"
emit("tag1",doc._id);
emit("tag2",doc._id);
emit("tag3",doc._id);
....

现在你有办法查询:给我所有用这些词语标记的文章:[" tag1"," tag2"等]

有关如何查询多个键的详细信息,请参阅"参数 - >密钥"在此处查询选项表中:

http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options

上述示例的一个问题是,如果使用您要查询的两个或所有标记标记单个文档,则会产生重复项。您可以使用CouchDB"列表函数"轻松地删除视图的结果。有关列表功能的更多信息,请访问:

http://guide.couchdb.org/draft/transforming.html

构建视图的另一种方法,以获得更强大的动态"对数据的访问将是从复杂数据类型(如JavaScript数组)中组合索引。还包含"范围查询"可以帮助。因此,例如,如果索引中有3项数组,但只有前2个值,则可以设置范围查询以提取与数组前2项匹配的所有文档。有关这方面的一些有用信息可以在这里找到:

http://guide.couchdb.org/draft/views.html

请参阅" startkey"和" endkey" "查询选项"下的选项这里的表格:

http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options

很高兴知道CouchDB如何为自己编制索引。它使用" B +树"数据结构:

http://guide.couchdb.org/draft/btree.html

在考虑如何编写索引时请记住这一点。这对于如何构建索引具有特定的含义。例如,如果使用数组中第一项的范围进行查询,则无法期望在视图上获得良好的性能。例如:

startkey = [a,1,2]
endkey = [z,1,2]

如果您的查询是:

,您将获得预期的效果
startkey = [1,2,a]
endkey = [1,2,z]

更一般地说,这意味着在查询视图时索引顺序很重要。不仅仅基于性能,而且基于将返回哪些文件。如果使用[1,2,3]索引视图中的文档,则无法在查询中显示索引[3,2,1],[2,1,3]或任何文档其他组合。

根据我的经验,使用CouchDB及其提供的基本工具可以优雅高效地解决大多数数据访问问题。如果/当您的项目需要对数据进行真正的动态访问时,我通常仍然使用CouchDB来满足常见的数据访问需求,但我还会使用ElasticSearch插件集成ElasticSearch,该插件会将数据从CouchDB流式传输到ElasticSearch中:

http://www.elasticsearch.org/

https://github.com/elasticsearch/elasticsearch-river-couchdb