2012-08-14 65 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