如何在CouchDB中编写视图以表示“不在”或“通过让count(*)= 1分组”?

问题描述 投票:0回答:1

以关系数据库为例,给定如下两个表,其中当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的文档。我可以用view做group by and count(*)等效项,但不能做group by, having count(*) = 1等效项。

我正在使用CouchDB 3.0。

sql nosql couchdb pouchdb
1个回答
0
投票

您可以写一个视图:

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

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

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

取决于您的设置,使用group_level=1查询视图可能会更容易,因此您可以获取所有键,然后遍历除B之外的所有键以获取您感兴趣的其余信息。

© www.soinside.com 2019 - 2024. All rights reserved.