2010-03-22 44 views
1

我的CouchDB數據庫作爲主文檔類型,看起來像:如何在Couchdb map/reduce中獲得用戶喜愛的用戶文檔視圖?

{ 
    "_id" : "doc1", 
    "type" : "main_doc", 
    "title" : "the first doc" 
    ... 
} 

有存儲用戶信息的文件另一種類型。我希望用戶能夠將文檔標記爲收藏夾。不同的用戶可以將相同或不同的文檔保存爲收藏夾。我的想法是引進了最喜歡的文檔跟蹤此類似:

{ 
    "_id" : "fav1", 
    "type" : "favorite", 
    "user_id" : "user1", 
    "doc_id" : "doc1" 
} 

這是很容易創建USER_ID爲重點,以獲得自己喜歡的文檔ID列表的視圖。例如:

function(doc) { 
    if (doc.type == "favorite") { 
     emit(doc.user_id, doc.doc_id); 
    } 
} 

但是我想列出收藏夾以顯示文檔中的user_id,doc_id和標題。所以輸出是這樣的:

{ "key" : "user1", "value" : ["doc1", "the first doc"] } 
+0

或者在單獨的請求中獲取文檔標題真的沒有多少開銷?我已有另一個輸出文檔ID和標題的視圖。我試圖避免再次調用數據庫來獲取每個喜愛的文檔標題。 – 2010-03-23 12:21:14

回答

2

在CouchDB中0.11(只是最近發佈),該功能include_docs=trueallows you to look up any document in your view row。例如:

function(doc) { 
    if(doc.type == "favorite") { 
     emit(doc.user_id, {_id: doc.doc_id}); 
    } 
} 

當您查詢您的看法與include_docs=true,你應該看到JSON這樣的:

// ... normal stuff 
rows: [ 
    { 
    "key":"user1", 
    "value":{"_id":"doc1"}, 
    "doc": { 
     "_id" : "doc1", 
     "type" : "main_doc", 
     "title" : "the first doc" 
     // ... 
    } 
    }, 
    { 
    // another doc, etc... 
    } 
] 
+0

這是一個很酷的新功能,但我不想返回整個文檔。我只想要一個只有標題的喜歡項目列表。如果用戶選擇查看文檔,我只需要整個文檔。 – 2010-03-23 12:03:01

+0

是的,我明白。當然,我的解決方案也會迫使你升級。但我不確定如何在沒有「模式」重構的情況下完成自己想要的任務。 – JasonSmith 2010-03-23 16:55:19

+0

我會考慮重構文檔如何安排來適應這種情況。有什麼建議麼? – 2010-03-23 21:04:49

0

如果您無法使用include_docs=true功能與v0.11,那麼你必須有當你爲你的視圖/地圖發射數據時,所有的信息都將在手邊。

而不是傳統的「加入」風格,可以考慮在main_doc文檔中存儲「偏愛」用戶列表。

{ 
    "_id" : "doc1", 
    "type" : "main_doc", 
    "title" : "the first doc", 
    "favorited_by": ["user1", "user2"] 
    // ... 
} 

這樣,當您的視圖運行時,您可以根據該文檔中的信息發出所有內容。

function(doc) { 
    if(doc.type == "main_doc") { 
     for (var a in doc.favorited_by) { 
      emit(doc.favorited_by[a], [doc._id, doc.title]); 
     } 
    } 
} 
+0

我可能不會遇到可伸縮性問題嗎?如果很多用戶試圖將這個文檔添加爲收藏夾,我可能會遇到很多衝突。 – 2010-03-24 21:27:47

+0

是的,你是對的。這是一種取決於您的預期使用情況的權衡。另一個想法是以另一種方式存儲它:在用戶對象中存儲'[「doc_id」,「文檔標題」]元組。這需要三次往返(1:獲取主文檔; 2:獲取用戶文檔,3:用新元組更新用戶文檔),但是您可能已經在必要的時間使用所有這些文檔。在讀取時,通過您的連接樣式文檔,我仍然希望將這一點與多次查找相比較。 – JasonSmith 2010-03-24 23:20:19

+0

我希望對最喜歡的查找進行單獨的讀取操作。我還試圖避免將文檔標題複製到其他文檔中,因爲如果標題在實際文檔中得到更新,則複製的標題已過期,或者需要使用此文檔作爲最喜歡的文檔來查找和更新所有用戶文檔。 – 2010-03-25 02:01:03

相關問題