【问题标题】:CouchDB emit on OR matchCouchDB 在 OR 匹配时发出
【发布时间】:2020-07-28 16:28:33
【问题描述】:

我有与 CouchDB 相关的查询:

让我们考虑一下我的数据库名称test视图名称user-view & design名称_design/user

我在 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 的值,并且我想使用相同的 view user-view 并得到以下结果:

案例 1 只有 name 可用作 ABC

我应该得到以下结果:

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

案例 2 只有 city 可用作 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" }
]

现在考虑我有多个姓名、城市、地区、邮政编码、 等),一次我可以有任何一个或要查询的 keys 的多个组合(例如,一次只有 name 的值或 cityregion 的唯一值em> 一次可用等),我不想最终创建多个视图。是否可以使用单一视图并仍然可以获得 results 的任意组合 keys

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    这在技术上是可行的,但不明智。

    对城市和名称使用相同视图的方法是在地图函数中发出两者:

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

    不明智的原因是您永远不会知道您要查询的是城市还是名称。例如,如果您有一个与城市同名的人,您将获得两个结果。

    所以处理这个问题的正确方法是使用两种视图,一种用于城市,一种用于名称。

    您可以通过限定 map 函数中的键类型来解决此问题,但这也会使您的查询复杂化,因为您必须指定要查询的键类型:

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

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

    【讨论】:

    • 我坚持使用相同的 view 的原因是假设我有多个 键(姓名、城市、地区、邮政编码等)。 并且有可能我每次都得到任何单个或多个 keys 组合来查询,所以这可能会导致创建多个 views
    • 如果您的目标是找到一个键的所有匹配项,无论它们进入哪个字段,那么单一视图是有意义的。但这听起来也有点像全文搜索,最好使用 CouchDB 3.1 的 full text search 功能来完成。
    • 我已经改写了这个问题,请你看一遍好吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多