CouchDB在OR匹配时发出

pftdvrlh  于 2022-12-09  发布在  CouchDB
关注(0)|答案(1)|浏览(147)

我有与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" }

假设我一次只有namecity的值,我想使用相同的 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 作为ABCcity 作为Pune可用

我应该得到如下结果:

[
   { "name" :"ABC", "city" :"Mumbai" }
   { "name" :"XYZ", "city" :"Pune" }
   { "name" :"ABC", "city" :"Pune" }
]

现在假设我有多个 * key *(**姓名、城市、地区、邮政编码、**等),并且在某个时间,我可能有任何单个或多个 * 键 * 组合来查询(例如,一次只能提供 name 的值,或者一次只能提供 cityregion 的值,等等),我不想最终创建多个视图。是否有可能使用单一视图并仍然能够获得任何 * 键 * 组合的 * 结果 *?

jutyujz0

jutyujz01#

这在技术上是可能的,但不明智。
对城市和名称使用相同视图的方法是在map函数中发出这两者:

function(doc) {
   emit(doc.name, doc);
   emit(doc.city, doc);
}

这是不明智的,因为你永远不知道你要查询的是城市还是名字。例如,如果你有一个人的名字和城市的名字一样,你会得到两个结果。
因此,正确的处理方法是使用两个视图,一个用于城市,一个用于名称。
您可以通过在map函数中限定键类型来解决此问题,但这也会使查询复杂化,因为您必须指定要查询得键类型:

function(doc) {
   emit("name:"+doc.name, doc);
   emit("city:"+doc.city, doc);
}

使用两个视图在磁盘使用率、索引查询速度(尽管可能稍有提高)和查询可读性方面会更有效。

相关问题