CouchDB中唯一键的唯一值
我需要在数据库中保存系统事务uuid、源、目标等中所有事务的元数据 我需要创建一个视图,统计每个目的地的所有唯一源。 例如,如果事务的src dst对为: dst1,src1 dst1,src1 dst1,src2 dst2,src3 我想得到: dst1,2 dst2,1 这是因为src1和src2是为dst1计数的,我不想对src1计数两次 我如何在Couchdb中实现这一点CouchDB中唯一键的唯一值,couchdb,unique,Couchdb,Unique,我需要在数据库中保存系统事务uuid、源、目标等中所有事务的元数据 我需要创建一个视图,统计每个目的地的所有唯一源。 例如,如果事务的src dst对为: dst1,src1 dst1,src1 dst1,src2 dst2,src3 我想得到: dst1,2 dst2,1 这是因为src1和src2是为dst1计数的,我不想对src1计数两次 我如何在Couchdb中实现这一点 此外,是否有办法只获取具有X个以上唯一源的目的地?您问题的第一部分在CouchDB中很棘手,CouchDB的设计不适
此外,是否有办法只获取具有X个以上唯一源的目的地?您问题的第一部分在CouchDB中很棘手,CouchDB的设计不适合处理此类关系数据。如果可能,您应该重新构造文档,以便针对每个目标显式存储源列表。有了它,您可以简单地编写一个视图,将目的地映射到源计数。假设每个目的地都有一个文档:
function(doc) {
emit(doc.id, doc.sources.length);
}
问题的第二部分是创建一个新视图并用键交换值,这样您就可以根据每个文档的源数量进行查询:
function(doc) {
emit(doc.sources.length, doc.id);
}
然后指定最小值的startkey:
?startkey=5
如果这是不可能的,您可以使用map/reduce函数为您提供所有唯一的行,但您无法让它告诉您有多少行
如果数据库中只有您建议的源和目标对,则可以编写如下映射函数:
function(doc) {
emit([doc.destination, doc.source], null);
}
?group=true&startkey=["dst1"]&endkey=["dst1",%20{}]
然后使用reduce函数计算唯一对的数量。在这种情况下,如果您是reduce函数的新手,您应该能够简单地使用内置的count函数,我最近讨论了以下基础:
_count
如果使用group=true查询此视图,则将为每个唯一的目标/源对返回一行。您可以获得特定目的地的所有对,如下所示:
function(doc) {
emit([doc.destination, doc.source], null);
}
?group=true&startkey=["dst1"]&endkey=["dst1",%20{}]
此时,您可以简单地计算内存中的行数。如果这不实用,例如返回的行数非常多,则必须考虑编写一个列表函数来生成计数:
function() {
var count = 0;
while(getRow())
count++;
return JSON.stringify({\"count\": count});
}
然后,以相同的方式调用此列表函数,用于您之前的视图:
/database/_design/designDocName/_list/listName/viewName?group=true&startkey=["dst1"]&endkey=["dst1",%20{}]
这将返回一个JSON对象,告诉您指定目的地有多少唯一行
这一切似乎都很笨拙——事实确实如此。文档数据库不能很好地处理此类关系,并且倾向于使用非规范化文档和嵌套:
{
"_id": "dst1",
"sources": ["src1", "src2", "src3"]
}