如何从 CouchDB 获取数据,过滤多个字段。
例如,如果我有一个包含姓名、州、国家等字段的人员数据库;和网页上的搜索表单,如何从 CouchDB 获取数据,仅考虑非空条件。
在 SQL 中,我会将条件附加到 where 子句 WHERE Person.Name="John" AND Person.State in ("NY","CA")
,但是我如何将此查询构建为 CouchDB View
最佳答案
在 CouchDB 中,您使用 map/reduce Views。在 SQL 中,您必须明确说明将为哪个字段索引创建。在 CouchDB 中,您编写自定义函数创建索引,因此它可以更具体地满足您的需求。如果您想要搜索名称、州和国家/地区字段等简单事物的索引,则 View 只是一个 map 函数:
function (doc) {
if (doc.name && doc.state && doc.country)
emit([doc.name, doc.state, doc.country], doc);
}
要使用此 View 进行搜索,请搜索关键字
["my_name", "my_state", "my_country"]
.您可以使用它来查询名称、州和国家/地区的子集,只要它们是已发出数组的前缀(例如,使用 name
搜索,但不能使用 state
和 country
搜索),因为 map 的可搜索结果是按字典序排列。原则上, View 是具有某些查询功能的索引,但不如 SQL 查询灵活。它们执行一次并存储在磁盘上,并针对新的/修改的数据进行增量计算。请注意,在分布式系统(为 CouchDB 设计的)中很难做效率低下的事情:更复杂的连接,没有索引的搜索......尽管在许多情况下,在结构化时不需要对关系模型中的表进行人工划分文档可用,并且不需要某些连接。
有关 CouchDB 与 SQL 的一些简要比较,请参阅 this chapter of The Definitive Guide书等章节及官方wiki有关 View 的更多信息。
关于nosql - 使用 CouchDB 进行多条件搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15272933/