couchdb查询中元组的唯一性

时间:2012-08-14 23:09:30

标签: couchdb couchdb-python

我正在尝试进行一项我尚未能够进行的查询。我的永久视图功能如下:

function(doc) { 
    if('llweb_result' in doc){
         for(i in doc.llweb_result){ 
             emit(doc.llweb_result[i].llweb_result, doc);
         }
    }
}

根据密钥,我会过滤结果。所以,我需要这把钥匙。其次,如你所见,有一个for循环。这会导致结果中出现相同的元组。但是,我还需要循环来检查所有内容。在这里,我只是想知道如何消除相同的元组?

我正在使用couchdb-python。我的相关代码是:

result = {}
result['0'] = self.dns_db.view('llweb/llweb_filter', None, key=0, limit = amount, startkey_docid = '000000052130')
result['1'] = self.dns_db.view('llweb/llweb_filter', None, key=1, limit=amount)
result['2'] = self.dns_db.view('llweb/llweb_filter', None, key=2, limit=amount)

从关键值可以理解,有三种不同类型的键。我以为我可以用[doc._id,llweb_result]扩展'key'。我需要像[*,2]这样的密钥,但我不知道它是可能的。然后,使用reduce函数对它们进行分组。这肯定会有效,但此时的问题是如何仅使用值[0,1,2]进行选择查询。

于16.08.12编辑

couchdb记录的'llweb_result'属性示例:

"llweb_result": {
   "1": {
       "ip": "66.233.123.15",
       "domain": "domain.com",
       "llweb_result": 1
   },
   "0": {
       "ip": "66.235.132.118",
       "domain": "domain.com',
       "llweb_result": 1
   }
}

一条记录中只有一个域名,但可能是多个ips。您可以将记录视为dns数据包。

我想根据llweb_result(0,1,2)对记录进行分组。我将为它们做一个选择查询(例如,我获取包含'1'的记录)。但是对于上面的例子,结果中会有两个相同的元组。

任何帮助都会得到满足。

2 个答案:

答案 0 :(得分:1)

如果在查询结果中出现重复对,则表示每个文档中都有重复的doc.llweb_result[i].llweb_result值。

您可以将视图功能更改为仅发出其中一个值(作为键)。一种方法是:

function(doc) {
    if ('llweb_result' in doc) {
         distinct_values = {};
         for (var i in doc.llweb_result) {
             distinct_values[doc.llweb_result[i].llweb_result] = true;
         }
         for(var dv in distinct_values) {
             emit(dv, doc);
         }
    }
}

答案 1 :(得分:0)

我对couchdb-python一无所知,但CouchDB支持数组中的单个key或多个keys。因此,请查看您的couchdb-python文档,了解如何提供keys=[0,1,2]作为参数。

关于获取唯一值,请查看at this section of CouchDB The Definitive Guide,其中解释了如何基本上添加NOOP减少,以便您可以使用group=true