2013-02-21 99 views
0

我有一個數據庫,我需要獲取一些值。數據庫由包含房間的文件組成,每個房間都有「樓層」和「酒店」屬性(還有一些房間,但這裏並不重要)。CouchDB:獲取唯一值

事情是;我需要找到我要求的酒店的所有樓層。 getAllFloorsOnHotel("hotel")有點兒東西。但我不知道如何查詢數據庫。我讀過這裏:http://guide.couchdb.org/editions/1/en/cookbook.html#unique,但它不是我所需要的。在那裏,他們使用鑰匙和group=true來刪除重複項,如果地板是關鍵的話,這將起作用,但在我的情況下,酒店是關鍵。因此,如果我使用group=true,那麼我自然只能在那家酒店得到1樓。如果我沒有使用group=true,我會得到指定酒店的所有樓層 - 重複。

我該如何讓couchdb給我一個酒店的所有樓層,沒有重複?

回答

2

你需要使用一個數組作爲鍵。

在你的地圖功能,您應該EMIT看起來是這樣的:

emit([doc.hotel, doc.floor], null); 

我已經把空的值,但它可以是你想用你的減少函數的任何信息。要獲得每家酒店每層的清單,您的減少功能可以返回true。

然後,當您查詢時,使用group_level而不是group,並將其分配給您希望按其分組的數組級別。 group_level = 2將逐層分組。

要與捲曲查詢房間你會去:

curl -X GET http://localhost:5894/yourDB/yourView?group_level=2 

這會給你所有的酒店,他們的所有樓層。要獲取特定酒店的列表,您需要查詢範圍。很難說如何用curl來做到這一點,因爲你必須對數組字符串做各種各樣的東西才能使它工作。你需要的變量是startkey和endkey。無論如何,你可能會使用ajax,所以只需將它們作爲選項傳遞即可。

startkey: ["hotelName", 0], 
endkey: ["hotelName", {}], 
group_level: 2 

0和{}只是低值和高值。 {}最後排序,所以無論你的字符串是在這兩個事物之間。另外,如果使用降序:true,則需要切換0和{}。 (這給我帶來了很多的痛苦)

還有更多的一些信息在這裏: CouchDB sorting and filtering in the same view

+0

謝謝你,它的工作原理!我也瞭解它);哦,我沒有使用AJAX,我使用Objective-C。無論如何,如果有人需要它,請在這裏尋找更多信息:http://guide.couchdb.org/draft/views.html#comments – ptf 2013-02-21 12:12:24