2012-02-07 151 views
2

我有以下DOC一個CouchDB的:做一個CouchDB的減少查詢單個鍵

{ 
    "name":"Chris", 
    "tags":["mustache", "music", "couchdb"] 
} 

{ 
    "name":"Noah", 
    "tags":["hypertext", "philosophy", "couchdb"] 
} 

{ 
    "name":"Jan", 
    "tags":["drums", "bike", "couchdb"] 
} 

地圖功能:

function(dude) { 
    if(dude.name && dude.tags) { 
    dude.tags.forEach(function(tag) { 
     emit(tag, 1); 
    }); 
    } 
} 

Reduce函數:現在

function(keys, values) { 
    return sum(values); 
} 

,如果我查詢與?group=true參數來看,我回來了計數爲每個標籤:

{"rows":[ 
{"key":"bike","value":1}, 
{"key":"couchdb","value":3}, 
{"key":"drums","value":1}, 
{"key":"hypertext","value":1}, 
{"key":"music","value":1}, 
{"key":"mustache","value":1}, 
{"key":"philosophy","value":1} 
]} 

我應該使用什麼查詢來獲得「couchdb」的值?

這個例子是從CouchDB的書拍攝,而我的實時應用具有關鍵的1000和大部分的時間我只需要找到一個單獨的密鑰的計數。

我不能夠使用鍵=參數,這是我真正想要的東西,因爲它返回一個空的結果。

如果我查詢?group=true&startkey="couchdb"&endkey="drums"我得到的CouchDB的計數獨自一人,但我不能使用startkey =endkey =,因爲我不知道接下來的關鍵是在現場DB什麼。

,你會在這種情況下,建議有什麼解決辦法?

回答

4

key="couchdb"&group=true應該工作。

我們在生產的工作完全一樣的若干意見和疑問,我只是試圖其中之一。如果你得到一個空的結果,也許這個鍵與你發出的不一樣。仔細檢查你是否發出一個單一的字符串作爲密鑰(你的發佈的地圖功能就是這樣做的),並且如果有任何大寫差異(使用toLowerCase()可以肯定 - 在你的例子中不應該這麼做)。

在其他情況下(任何標記開始「CouchDB的」),你可以在最後使用endkey高字符(「CouchDB的\ ufff0」),但這並不能幫助這裏。

+3

我同意,簡單的按鍵和組查詢應該只是工作。有一件事要注意可能是正確的urlEncoding任何你需要的雙引號。 – 2012-02-07 15:04:33

+0

感謝您的回答,Bernhard。我需要正確地逃脫關鍵的空間。 – 2012-02-16 06:41:52