2012-08-14 66 views
0

我正在尝试进行查询,但我还没有做到。我的永久查看功能如下:couchdb查询中元组的唯一性

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

取决于密钥,我筛选结果。所以,我需要这个钥匙。其次,如你所见,有一个for循环。这会在结果中产生相同的元组。不过,我也需要做这个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]扩展'关键'。我需要一个像[*,2]这样的密钥,但我不知道这是可能的。然后,使用reduce函数对它们进行分组。这肯定会起作用,但目前的问题是如何仅使用值[0,1,2]进行选择查询。

更新于12年8月16日

例如,对于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 
    } 
} 

有一个记录只有一个域名,但疗法可能是其多个IP地址。您可以将该记录视为一个dns数据包。

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

任何帮助将appriciated。

+0

你绝对应该给一些更多的细节。请解释您尝试解决的问题。并提供一些示例文档。 – 2012-08-16 13:22:00

回答

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); 
     } 
    } 
} 
+0

这不是我正在寻找的东西。 – Shnkc 2012-08-15 19:48:10

+1

好的。那么你请详细说明一下吗? – behnam 2012-08-16 06:07:30

+0

我已经延长了这个问题 – Shnkc 2012-08-16 18:04:59

0

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

对于刚刚获得的唯一值,看看at this section of CouchDB The Definitive Guide解释如何从根本上增加一个空操作减少,所以你可以使用group=true