2012-04-21 54 views
3

假設我有一個像這樣的CouchDB文檔:可能從couchdb視圖中反轉索引?

{ 
    "_id": "id", 
    "_rev": "rev", 
    "title": "foobar", 
    "URI": "http://www.foobar.com", 
    "notes": "", 
    "date": 1334177254774, 
    "tags": [ 
     "tag1", 
     "tag2", 
     "tag3" 
    ], 
    "date_modified": 1334177278457, 
    "deleted": false 
} 

我想是創建標籤的倒排索引,所以我最終的東西,如:

{ 
    "tag1": [ 
     _id, 
     _id, 
     _id 
    ], 
    "tag2": [ 
     _id, 
     _id, 
     ... 
    ] 
} 

從我已經閱讀並嘗試過,couchdb可能不會讓我這樣做。我無法在地圖階段完成它,似乎我不能在沙發縮小階段做到這一點。 這是我需要在應用的另一層完成的事情嗎?

+0

你有什麼試過?對於映射階段來說,您會對代碼執行for循環,然後對每個代碼執行'emit(tag,_id)'。然後,在reduce中,您可以將鍵值對與相同的鍵組合在一起。我還沒有嘗試過。 – 2012-04-21 05:04:43

+0

@MatthewFlaschen,因爲無法預測結果的大小,所以無法將縮減中的鍵值對組合在一起。減少功能,必須嚴格把輸入減小到一個小的,固定的最大尺寸。 – 2012-04-22 08:08:20

回答

3

可以用CouchDB的地圖功能實現這一點。

CouchDB的喜歡高大名單,不脂肪名單。因此,在這個問題上「切割穀物」時,您需要在標籤上鍵入一個視圖,每個文檔ID一行。

// View rows (conceptual diagram) 
// Key , Value 
[ "tag1", "_id1" 
, "tag1", "_id2" 
, "tag1", "_id3" 

, "tag2", "_id2" 
, "tag2", "_id4" 
, "tag3", "_id6" 
] 

要得到一個標籤的所有文件ID的列表,擊中標籤名稱爲重點,GET /db/_design/ddoc/_view/tags?key="tag1"視圖。

這應該夠了。但是作爲lagniappe,您可以將"reduce"的值設置爲"_count"以獲得所有使用的標記的計數(可用於構建標記雲)。當你想查詢你的索引時,請記住添加&reduce=false

+0

完美 - 謝謝。 – 2012-04-23 19:50:18