2012-10-17 82 views
3

我對couchdb的意見/ map-reduce有疑問。CouchDB視圖 - 多個篩選器

比方說,我們與酒店的文檔數據庫如下所示:

[{ 
     _id: "1", 
     name: "Hotel A", 
     type: "hotel", 
     stars: 3, 
     flags: ["family-friendly","green-hotel","sport"], 
     hotelType: "premium", 
     food: ["breakfast","lunch"] 
    }, { 
     _id: "2", 
     name: "Hotel B", 
     type: "hotel", 
     stars: 5, 
     flags: ["family-friendly","pet-friendly"], 
     hotelType: "budget", 
     food: ["breakfast","lunch","dinner"] 
    }] 

要找到所有酒店,3星,下面的視圖將適合:

function(doc) { 
    emit([doc.stars, doc.name]); 
} 

如果我使用startkey = [3],一切都很好。

但是怎麼可能用多個濾鏡製作視圖?

例如 - 所有酒店

  • 用3星級及標誌「家庭友好」和「寵物友好」和 與hotelType「預算」?
  • with hotelType「premium」and food「breakfast」or「lunch」?

任何想法?

編輯: 我現在已經決定使用良好的舊mysql。 CouchDB對我來說是一個很好的體驗,但是如果您需要的數據超過一個文檔的數據,那麼存在的問題太多:(

回答

1

您需要使用不同的視圖,每個視圖將使用自己的密鑰處理他自己的域。可以創建一個視圖換所有數據通過多個具有不同key值發射,但在立體這將是很難維持

1

可以發射一個鍵與一組值:

emit([[doc.stars,doc.hotelType], doc.name]); 

問題是,只有當您可以按重要性排序屬性時,這才起作用,因爲它們總是以相同的順序減少。 xepal使用不同視圖的解決方案可能是最適合您的情況。

來源:http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Grouping

+0

感謝您的反饋。 我知道我可以發射多次,而且我可以使用數組作爲鍵。 \t功能(DOC){ \t \t //按名稱 \t \t EMIT([1,DOC。名稱]); \t \t \t 通過\t // hotelType \t \t EMIT([2,1 doc.hotelType]); \t \t \t 通過\t標誌// \t \t爲(VAR i的doc.flags){ \t \t \t EMIT([3,doc.flags [I]]); \t \t} \t \t //由分和一個標記(一個或多個) \t \t爲(VAR i的doc.flags){ \t \t \t EMIT([4,DOC doc.flags [i]中。]); \t \t} \t} 但是,我如何搜索「星星和更多然後一個標誌」的例子?有沒有解決方法? – bernhardh

+0

可讀格式:http://pastebin.com/n8rsp87r – bernhardh

0

CouchDB視圖是一維的。而你正在尋找多維查詢:

  • X =明星
  • Y =標誌
  • Z = hotelType

多維查詢是不支持的不幸。例如,如果您需要按緯度和經度查詢地理位置,則需要使用GeoCouch。

+0

感謝您的反饋。但是,有沒有解決我的問題?不要使用couchdb?使用列表功能? etc ... – bernhardh

+1

你需要考慮一個SQL數據庫來完成這個任務。 – Antonio

+1

您可能需要使用SQL,以便您可以獨立比較兩個值,或者需要爲要創建的每個搜索查詢組合創建一個視圖。 CouchDB就是這樣設計的,因此它可以擴展。 – pokstad