0

我正在尝试进行一个我还无法进行的查询。我的永久视图功能如下:

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] 进行选择查询。

编辑于 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
   }
}

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

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

任何帮助都会得到帮助。

4

2 回答 2

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);
         }
    }
}
于 2012-08-15T00:26:29.313 回答
0

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

关于仅获取唯一值,请查看CouchDB The Definitive Guide的这一部分,它解释了如何基本添加 NOOP 减少,因此您可以使用group=true

于 2012-08-15T01:16:57.403 回答