8

如何从 CouchDB 获取数据,过滤多个字段。

例如,如果我有一个包含姓名、州、国家等字段的人员数据库;和网页上的搜索表单,我如何从 CouchDB 获取数据,仅考虑非空条件。

在 SQL 中,我会将条件附加到 where 子句WHERE Person.Name="John" AND Person.State in ("NY","CA"),但是如何将此查询构建为 CouchDB 视图

4

2 回答 2

7

在 CouchDB 中,您使用 map/reduce 视图。在 SQL 中,您必须明确说明将创建哪个字段索引。在 CouchDB 中,您编写自定义函数创建索引,因此它可以更具体地满足您的需求。如果您想要索引这样简单的事情,例如使用名称、州和国家字段进行搜索,则视图只是一个地图功能:

function (doc) {
  if (doc.name && doc.state && doc.country)
    emit([doc.name, doc.state, doc.country], doc);
}

要使用此视图进行搜索,请搜索 key ["my_name", "my_state", "my_country"]。您可以使用它来查询名称、州和国家/地区的子集,只要它们是发出数组的前缀(例如,使用 and 搜索name但不使用stateand country),因为 map 的可搜索结果是按字典顺序排序的。

原则上,视图是具有某些查询功能的索引,但不如 SQL 查询灵活。它们执行一次并存储在磁盘上,并针对新的/修改的数据进行增量计算。请注意,在分布式系统中很难做效率低下的事情(为此设计了 CouchDB):更复杂的连接,没有索引的搜索......尽管在许多情况下,在结构化时,关系模型中的表的人为划分不是必需的文档是可用的,并且某些连接是不需要的。

有关 CouchDB 与 SQL 的简要比较,请参阅The Definitive Guide book 的这一章和其他章节以及官方wiki以获取有关视图的更多信息。

于 2013-03-07T19:10:43.263 回答
0

您需要创建一个视图,其中包含 [doc.name, doc state]。这在文档中有很好的描述。真正的问题是如何从两个随机状态中选择人。

这是一篇回答这个问题的好文章:使用多个开始和结束键进行 CouchDB 视图

于 2013-03-10T07:58:01.527 回答