创建一个相当简单的视图的文档很容易找到:
view :completed, :key => :name, :conditions => 'doc.completed === true'
但是,如何使用动态创建的条件构建视图?例如,如果我想使用查询
doc.owner_id == my_var
my_var 以编程方式设置的位置。
这甚至可能吗?我对 NoSQL 很陌生,如果我没有任何意义,我深表歉意。
创建一个相当简单的视图的文档很容易找到:
view :completed, :key => :name, :conditions => 'doc.completed === true'
但是,如何使用动态创建的条件构建视图?例如,如果我想使用查询
doc.owner_id == my_var
my_var 以编程方式设置的位置。
这甚至可能吗?我对 NoSQL 很陌生,如果我没有任何意义,我深表歉意。
CouchDB 中的视图随着数据插入/更新到特定数据库而增量构建/索引。因此,为了充分利用视图背后的强大功能,您不会想要动态查询它们。您将希望以一种可以根据应用程序的预期使用模式有效访问数据的方式构建视图。以我的经验,拥有多个视图并不少见,每个视图都为您提供了访问/查询相同数据的不同方式。我发现将 CouchDB 视图视为系统地非规范化文档的一种方式很有帮助。
另一方面,也有一些方法可以在视图中概括索引,以便您可以使用单个视图来进行无休止的查询组合。
例如,您有一个“文章”数据库,每个文章文档都包含一个标签列表。如果你想设置一个查询来动态检索所有带有少量标签的文章,你可以向同一个文档的视图发出多个条目:
// this article is tagged with "tag1","tag2","tag3"
emit("tag1",doc._id);
emit("tag2",doc._id);
emit("tag3",doc._id);
....
现在你有一个查询方法:给我所有用这些词标记的文章:["tag1","tag2",etc]
有关如何查询多个键的更多信息,请参见此处查询选项表中的“参数 -> 键”:
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
请参阅此处“查询选项”表下的“开始键”和“结束键”选项:
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 中:
https://github.com/elasticsearch/elasticsearch-river-couchdb