2013-03-07 81 views
8

如何從CouchDB獲取數據,並通過多個字段進行篩選。例如,如果我有一個具有姓名,州,國家等字段的人員數據庫;和網頁上的搜索表單,我如何從CouchDB獲取數據,僅考慮非空條件。使用CouchDB進行多標準搜索

在SQL,我會追加條件,where子句WHERE Person.Name="John" AND Person.State in ("NY","CA"),但如何實現在構圖這個查詢作爲CouchDB的視圖

回答

7

在CouchDB中使用的map/reduce意見。在SQL中,您必須明確指出將創建哪個字段索引。在CouchDB中,您可以編寫自定義函數創建索引,因此它可以更具體地滿足您的需求。如果你想爲這樣一個簡單的事情,與名稱,州和國家的搜索索引字段中的視圖僅僅是一個地圖功能:

function (doc) { 
    if (doc.name && doc.state && doc.country) 
    emit([doc.name, doc.state, doc.country], doc); 
} 

要使用該視圖搜索鍵["my_name", "my_state", "my_country"]搜索。只要它們是發射陣列的前綴(例如,使用name而不是statecountry進行搜索),您可以使用它來查詢名稱,州和國家的子集,因爲map的可搜索結果按照字典順序排序。

儘管如此,原則上,視圖是具有查詢功能的索引,並不像SQL查詢那麼靈活。它們被執行一次並存儲在磁盤上,並逐步計算新的/修改的數據。請注意,在分佈式系統中很難做到效率低下的事情(爲此設計CouchDB):更復雜的連接,沒有索引的搜索...儘管在很多情況下,在關係模型中對錶進行人爲劃分時,文件是可用的,並且一些連接是不需要的。

有關CouchDB與SQL的一些簡要比較,請參閱this chapter of The Definitive Guide書籍和其他章節以及官方wiki以獲取有關視圖的更多信息。

+0

我覺得這裏真正的問題是什麼時,你有場高x個做的,你不知道你的用戶是搜索條件的組合要過濾。如果您有20個字段,則無法創建處理潛在搜索條件的所有組合所需的2.432902e + 18個視圖。你能有20個意見,然後嘗試以某種方式相交視圖? – 2014-05-05 19:17:58

+0

CouchDB不是通用數據庫。您應該爲特定用例設計數據結構(文檔方案和視圖)。儘管多維查詢並沒有額外的插件(如GeoCouch或使用lucene/elasticsearch),您可能會嘗試避免它。將SQL簡單轉換爲視圖並將關係設計映射到JSON文檔是不夠的。 – 2014-05-06 08:38:26