2013-03-28 75 views
1

我一直在閱讀關於CouchDB的更多信息,並且非常喜歡它(master:master replication是我想要使用它的主要原因之一)。CouchDB - 如何基於最終用戶輸入創建動態設計文檔

但是,我有一個查詢問你們...我從PHP的凸輪,並經常使用Drupal CMS。我最喜歡的一個(可能是整個drupal社區)是MerlinOfChaos編寫的'Views'插件。這個想法是,管理員可以使用視圖ui系統,從數據庫中創建一個動態的內容流。該內容可以來自任何內容類型(博客文章,文章,用戶,圖像等),並且可以被過濾,排序,以網格排列,等等。一個簡單的例子是爲動畫滑塊創建內容來源。管理員可以隨時進入並更改其中顯示的內容。雖然通常我會將其設置爲內容類型X的最近5個。

因此,對於像mongo這樣的東西,我可以看看如何做到這一點。一個相當先進的解析器,然後將管理員想要的內容轉換爲數據庫查詢。由於mongo都基於動態查詢,因此非常可行。不過,我想用沙發。

我已經看到,我可以創建一個視圖,它需要一個參數,並將返回基於該參數的結果(例如,您要顯示的5個文章ID的參數)。但是如果我想能夠從UI中構建更高級的東西呢?我會添加更多的參數嗎?例如,假設創建的視圖選擇值爲'contentType'='post'且參數爲id /頁面標題的所有文檔。但是如果我希望最終用戶也能夠選擇視圖查詢的內容類型。或者最近的5篇文章,只要內容類型是3個不同的值之一?

這使我想到的另一件事是,一旦像這樣的視圖被創建並保存到數據庫中,並且第一次調用它,它就花費時間來創建結果。你會在生產/現場系統上做到這一點嗎?

部分原因是我希望最終用戶能夠根據網站上的文章和帖子在其個人資料頁面上創建內容的自定義提要。並能夠過濾它們並製作他們自己的類別,這樣可以說出來並給它們加上標籤。如他們的'技術'飼料,和他們的'食物'飼料。

我還是新來的沙發,還有閱讀要做。但是,這是一個buggins我,我正在試圖包裹我的頭。由於我想到的產品將根據最終用戶的輸入而動態變化。

應用程序本身將用Python編寫的

+0

我會非常關心一個系統的性能,該系統可能有數百或數千個設計文檔/視圖,每個系統最終都會針對數據庫的每次更新運行。 – WiredPrairie 2013-03-28 11:06:25

+0

是的,這是重點,我不想要所有這些。所以我想弄清楚如何有效地做到這一點。 – skift 2013-03-28 17:32:13

回答

1

簡而言之,你將需要發出像這樣的觀點:

emit([doc.contentType, doc.addDate], doc); // emit the entire doc, 
// add date is timestamp (assuming) 

emit([doc.contentType, doc.addDate], null); // use with include_docs=true 

然後,當你需要取得上市:

startkey=["post",0]&endkey=["post",999999999]&limit=5&descending=true 

解釋:

startkey = ["post",0] = contentType is post, and addDate >= 0 
endkey  = ["post",9999999999] = contentType is post, and addDate <= 9999999999 
limit  = 5, limit to five posts 
descending = true = sort descending, which is sort by adddDate descending 

爲了克服更新直播分貝的意見,
你也可以創建一個新的設計(圖)文檔的缺點。
因此,至少您現有的代碼和視圖不會受到影響。

只有在創建新視圖之後,您纔會部署最新的代碼以切換到此新視圖
並且您可以撤銷舊視圖。

+0

我想我明白你在做什麼。如果用戶現在決定他們只需要來自特定用戶的帖子,該怎麼辦?或者如果不僅僅是帖子,他們希望看到帖子以及新圖片?爲了添加作者,我猜我只是將它添加到上面並將其默認爲None,如果是None,則不要使用它/顯示全部。我將如何基於可變數量的內容類型進行doc.contentType查詢? – skift 2013-03-28 17:38:01

+0

您必須在製作視圖之前確定業務邏輯。如果想從某些用戶發佈帖子 - 沒有真正快捷的方法。但是,您可以將另一個鍵(用戶)添加到發射中。對於多個contentType ...你必須先確定。就像你說的,'if(doc.ContentType =='posts'|| doc.contentType =='images'){emit(doc.addDate,doc); }' – ajreal 2013-03-28 17:45:18

+0

我可以這樣做嗎? (內容類型在doc.ContentType中){emit(doc.addDate,doc);} if(contentType in doc.ContentType){emit(doc.addDate,doc);} if(contentType in doc.ContentType){emit(doc.addDate,doc); }' – skift 2013-03-29 02:44:00