我正在尝试进行一项我尚未能够进行的查询。我的永久视图功能如下:
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'的记录)。但是对于上面的例子,结果中会有两个相同的元组。
任何帮助都会得到满足。
答案 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