以关系数据库为例,给定如下两个表,其中当tableA
和tableB
中的行具有相同的值时,它们表示相同的“事物”,但处于不同的“状态”。因此,对于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。
您可以写一个视图:
function (doc) {
emit(doc.type, 1);
}
然后,如果需要这些文档的全部内容,请使用键"A"
和include_docs=true
查询视图。
如果您不仅想要"A"
,还想要"everything but B"
,则可以从开始到B,然后从B到结束进行查询,并以此方式获取所有文档。
取决于您的设置,使用group_level=1
查询视图可能会更容易,因此您可以获取所有键,然后遍历除B之外的所有键以获取您感兴趣的其余信息。