Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CouchDB中唯一键的唯一值_Couchdb_Unique - Fatal编程技术网

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的设计不适

我需要在数据库中保存系统事务uuid、源、目标等中所有事务的元数据

我需要创建一个视图,统计每个目的地的所有唯一源。 例如,如果事务的src dst对为:

dst1,src1 dst1,src1 dst1,src2 dst2,src3 我想得到:

dst1,2 dst2,1 这是因为src1和src2是为dst1计数的,我不想对src1计数两次

我如何在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"]
}