使用CouchDB进行多标准搜索

时间:2013-03-07 13:51:31

标签: nosql couchdb

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

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

原则上,视图是具有查询功能的索引,但不像SQL查询那样灵活。它们被执行一次并存储在磁盘上,并逐步计算新的/修改的数据。请注意,在分布式系统(设计CouchDB)中很难做到效率低的事情:更复杂的连接,没有索引的搜索......虽然,在很多情况下,关系模型中的表的人工划分在结构化时没有必要文档可用,不需要一些连接。

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

答案 1 :(得分:0)

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

这是一篇回答这个问题的好文章:Using Multiple Start and End Keys for CouchDB Views