2016-04-25 36 views
0

我一直在閱讀有關沙發數據庫視圖(http://wiki.apache.org/couchdb/HTTP_view_API#HTTP_View_API,http://www.barkingiguana.com/2009/01/22/filtering-and-ordering-couchdb-view-results/)的文檔,但是我找不到我在找什麼,我開始想它不支持。在沙發上查詢地圖鍵/值對db

我在沙發數據庫中的兩個記錄

{ 
    "_id": "UUID", 
    "_rev": "rev", 
    "status": "complete", 
    "csv": [ 
      { 
       "Lower": 0.09, 
       "Upper": 0.31 
      } 
    ], 
    "tags": { 
     "get_info": { 
      "duration": "24", 
      "location": "south" 
     } 
    } 
} 

{ 
    "_id": "2-UUID", 
    "_rev": "2-rev", 
    "status": "complete", 
    "csv": [ 
      { 
       "Lower": 0.01, 
       "Upper": 0.70 
      } 
    ], 
    "tags": { 
     "different_info": { 
      "duration": "60", 
      "location": "south" 
     } 
    } 
} 

是否有可能創建一個視圖,並添加查詢參數,將返回有標籤的「鑰匙」的所有記錄:「價值」(例如,我想要標記爲「持續時間」的所有記錄:24或我想要標記爲「位置」的所有記錄:「南」)。我不想將任何鍵/值硬編碼到視圖中 - 它們應該與查詢一起傳遞。

有沒有另一種思考方式,這不是一個視圖?做到這一點

回答

1

一種方法是發出在你看來所有的標籤,使用[ key, value ]數組:

function (doc) { 
    for (var type in doc.tags) { 
    for (var tag in doc.tags[type]) { 
     emit([ tag, doc.tags[type][tag] ]); 
    } 
    } 
} 

可以查詢與特定對你的看法:key=["duration","24"]。您也可以使用startkeyendkey進行範圍搜索。

如果您選擇POST,您可以指定密鑰列表:keys[]=["duration","24"]&keys[]=["location","south"]。但是,使用此方法,您將失去進行範圍搜索的能力。 (至少atm)

當查詢這樣的多個鍵時,您將獲得與任何鍵匹配的所有文檔,因此您可能需要在客戶端重複刪除結果。

CouchDB視圖更多的是關於計算和算法,而不是最好的任意查詢和搜索。爲此,我強烈建議添加一個搜索層,例如couchdb-luceneelasticsearch