【问题标题】:How to write a view in CouchDB to represent "not in" or "group by having count(*) = 1"?如何在 CouchDB 中编写一个视图来表示“不在”或“通过 count(*) = 1 分组”?
【发布时间】:2020-05-16 23:32:22
【问题描述】:

以关系数据库为例,给定如下两个表,当tableAtableB 中的行具有相同的值时,它们代表相同的“事物”但处于不同的“状态”。所以对于ID=1,这个东西经过了stage1和2。但是对于ID=2,这个东西只经过了stage1。

tableA (Id, columnA, columnB)
         1, "a", "b"
         2, "x", "y"
         3, "z", "a"
tableB (Id, columnA, columnB)
         1, "e", "f"

我想从tableA 中找到所有不存在tableB 中的行。

select  a.*
from    tableA a
  left join
        tableB b
  on    a.Id = b.Id
where   b.Id is null

所以上面的 SQL 将显示 tableA 中的第 2 行和第 3 行。

如何在 CouchDB 中做类似的事情?假设我有 4 个如下所示的文档。

{ "_id":"a-1", "type":"A", "correlation_id": "1" }
{ "_id":"a-2", "type":"A", "correlation_id": "2" }
{ "_id":"a-3", "type":"A", "correlation_id": "3" }
{ "_id":"b-1", "type":"B", "correlation_id": "1" }

如何创建只显示文档id = a-2 and a-3 的视图?我不想过滤,只想显示所有没有type B 的文档。我可以做一个 group by and count(*) 等效视图,但我不能做一个 group by, having count(*) = 1 等效。

我正在使用 CouchDB 3.0。

【问题讨论】:

  • 我发现了一些较旧的帖子。 stackoverflow.com/questions/14413953/… 但是……“列表”功能不再可用。 “列表函数在 CouchDB 3.0 中已弃用,将在 CouchDB 4.0 中删除。”也许我不能“不在”使用 CouchDB,而不得不提出不同的文档设计。
  • 这些文档是视图的结果吗?如果它们只是数据库中的文档,那么您的解决方案就是一个视图。
  • 那些具有上述“_id”属性的“文档”是 CouchDB 文档。我能够使用计数和分层键进行一些“分组”以进行查看,但我不确定如何在 2 种不同类型的文档中获得“不在”行为。

标签: sql nosql couchdb pouchdb


【解决方案1】:

你可以写一个视图:

function (doc) {
  emit(doc.type, 1);
}

如果您想要这些文档的全部内容,然后使用键 "A"include_docs=true 查询视图。

如果您不仅想要"A",还想要"everything but B",您可以从开始查询到B,然后从B 查询到结束,并以这种方式获取所有文档。

根据您的设置,使用group_level=1 查询视图可能会更容易,因此您可以获取所有键,然后遍历它们(不包括 B)以获取您感兴趣的其余信息。

【讨论】:

  • 您能否详细说明“从开始到 B 再从 B 到结束的查询并以这种方式获取所有文档”?我想获得这些文档。 {“_id”:“a-2”,“类型”:“A”,“correlation_id”:“2”} {“_id”:“a-3”,“类型”:“A”,“correlation_id”: “3”}
  • 请详细说明“使用 group_level=1 查询视图,以便获取所有键,然后遍历它们(不包括 B)以获取您感兴趣的其余信息”。我确实尝试使用 group_level=1 但也许我不知道自己在做什么。
  • 查询视图实际上是 couchdb 的基本块。这里都有描述docs.couchdb.org/en/stable/api/ddoc/views.html
  • 如果你想使用 group_level=XX,你的键需要是一个数组来匹配你将在你的视图中发出的数组。因此,如果您 emit([doc.type,doc._id],1) 可以在查询该视图时使用 group_level=1 ,这将返回所有唯一的 doc.type
猜你喜欢
  • 2020-11-03
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 2020-12-05
  • 2016-12-23
相关资源
最近更新 更多