我有与CouchDB相关的查询:
让我们考虑一下我的 *DB名称 :测试, 视图名称 *:用户视图& * 设计名称 *:_设计/用户。
我在 couchdb 中有以下 * 文档 *:
{ "name" :"ABC", "city" :"Mumbai" }
{ "name" :"PQR", "city" :"Mumbai" }
{ "name" :"XYZ", "city" :"Pune" }
{ "name" :"ABC", "city" :"Pune" }
我有以下用户视图:
function(doc) {
emit([doc.name, doc.city], doc);
}
当我发送以下 *GET请求 * 时:
http://127.0.0.1:5984/test/_design/user/_view/user-view?include_docs=true&key=['ABC','Pune']
得到如下结果:
{ "name" :"ABC", "city" :"Pune" }
假设我一次只有name或city的值,我想使用相同的 viewuser-view,并得到以下结果:
案例1只有 name 可用作ABC
我应该得到如下结果:
[
{ "name" :"ABC", "city" :"Mumbai" }
{ "name" :"ABC", "city" :"Pune" }
]
案例2仅 * 城市 * 可用作Pune
我应该得到如下结果:
[
{ "name" :"XYZ", "city" :"Pune" }
{ "name" :"ABC", "city" :"Pune" }
]
案例3只有 name 作为ABC和 city 作为Pune可用
我应该得到如下结果:
[
{ "name" :"ABC", "city" :"Mumbai" }
{ "name" :"XYZ", "city" :"Pune" }
{ "name" :"ABC", "city" :"Pune" }
]
现在假设我有多个 * key *(**姓名、城市、地区、邮政编码、**等),并且在某个时间,我可能有任何单个或多个 * 键 * 组合来查询(例如,一次只能提供 name 的值,或者一次只能提供 city 和 region 的值,等等),我不想最终创建多个视图。是否有可能使用单一视图并仍然能够获得任何 * 键 * 组合的 * 结果 *?
1条答案
按热度按时间jutyujz01#
这在技术上是可能的,但不明智。
对城市和名称使用相同视图的方法是在map函数中发出这两者:
这是不明智的,因为你永远不知道你要查询的是城市还是名字。例如,如果你有一个人的名字和城市的名字一样,你会得到两个结果。
因此,正确的处理方法是使用两个视图,一个用于城市,一个用于名称。
您可以通过在map函数中限定键类型来解决此问题,但这也会使查询复杂化,因为您必须指定要查询得键类型:
使用两个视图在磁盘使用率、索引查询速度(尽管可能稍有提高)和查询可读性方面会更有效。