2010-08-23 93 views
7

是否可以在CouchDB中使用類似的查詢?喜歡用兩個鍵CouchDB和多個鍵

SELECT field FROM table WHERE value1="key1" OR value2="key2" 

我總是隻用一個鍵。

function(doc) { 

    emit(doc.title, doc); 

} 

謝謝。

回答

0

是的。如果我理解你的問題,像這樣的應該做的伎倆:

function(doc) { 
    a = (doc.value1 && doc.value1 == "key1"); 
    b = (doc.value2 && doc.value2 == "key2"); 
    if (a || b) { 
    emit(doc._id,doc.title); 
    } 
} 

只發出你需要的文件或值。

+7

嗯,當然,如果你事先知道「key1」和「key2」,但是如果你想讓他們成爲「動態」參數呢? – 2011-11-16 18:01:39

4

在CouchDB中0.9和上面可以張貼到視圖(或_all_docs)與身體像:

{"keys": ["key1", "key2", ...]} 

爲了檢索該組與匹配鍵的行的。

+0

這不回答這個問題。一旦你找到了你想要的文件,這只是得到文件。訣竅是搞清楚你想要的文件清單。 – 2011-11-16 18:09:27

0

我想補充這duluthian的答覆:

emit(doc.title, null) 

您可以隨時拉出「_id」,並使用view api.

-2

你能做到這一點DOC值(假設你要「動態參數「)通過使用2個單獨的視圖和一個小小的客戶端處理:

您將有一個視圖」field1「,您將查詢」value1「。 (獲取文檔ID列表)

然後,您查詢「field2」上的第二個視圖,傳遞「value2」,並獲取Doc ID的另一個列表。現在

,你只需要找到該ID號 的2所列出的「交叉點」(作爲練習留給讀者)

+3

它只是不適用於大量的數據。交集是O(n log n),它會使客戶窒息足夠的結果 – Andrea 2012-05-31 08:15:03

0

您可以創建這樣一個觀點:

function(doc){ 
    if(doc.value1) emit(doc.value1, doc.field); 
    if(doc.value2) emit(doc.value2, doc.field); 
} 

然後使用llasram的建議發佈到與視圖查詢它:

{"keys": ["key1", "key2", ...]} 

您的客戶將不得不警惕了DUP雖然。 doc.value1 ==「key1」& & doc.value2 ==「key2」的文檔將顯示兩次。只需使用_id來過濾結果。

0

一個需要擴大一點llasram的答案;該指數必須包含值這兩個領域:

function(doc) { 
    emit("value1:"+doc.value1); // add check for undefined, null, etc. 
    emit("value2:"+doc.value2); 
} 

然後用

keys=["value1:key1","value2:key2"] 

編輯查詢:這將同一文件多次舉報但如果它包含的匹配值+密鑰對。