2016-04-28 155 views
6

從mongo切換到pouchdb(使用Cloudant),我喜歡「每個用戶一個數據庫」的概念,但是有沒有辦法爲每個數據庫創建多個集合/表?我可以爲每個數據庫創建多個集合嗎?

- Peter 
     - History 
     - Settings 
     - Friends 
- John 
     - History 
     - Settings 
     - Friends 

等等

感謝

回答

10

的CouchDB沒有收藏的概念。但是,您可以使用文檔上的類型標識符和Couchdb視圖一起獲得類似的結果。

類型標識符

當您保存在CouchDB中的文檔添加一個指定類型的字段。例如,你將存儲的朋友,像這樣:

{ 
    _id: "XXXX", 
    type: "Friend", 
    first_name: "John", 
    ... 
} 

你將存儲的歷史是這樣的:

{ 
    _id: "XXXX", 
    type: "History", 
    url: "http://www.google.com", 
    ... 
} 

這兩個文件是在同一數據庫中,如果您查詢所有文檔在那個數據庫上,你會收到兩個。

查看

您可以創建視圖上的類型,然後過濾器直接查詢這些看法。例如,創建一個視圖來檢索的朋友像這樣(在Cloudant你可以去添加新的設計文檔,你可以直接複製並粘貼此):

{ 
    "_id" : "_design/friends", 
    "views" : { 
    "all" : { 
     "map" : "function(doc){ if (doc.type && doc.type == 'Friend') { emit(doc._id, doc._rev)}}" 
    } 
    } 
} 

讓我們展開地圖功能:

function(doc) { 
    if (doc.type && doc.type == "Friend") { 
    emit(doc._id, doc._rev); 
    } 
} 

本質上這個映射函數說只將文檔關聯到此視圖的類型==「朋友」。現在,我們可以查詢這個視圖,只有朋友將返回:

http://SERVER/DATABASE/_design/friends/_view/all 

friends =設計文檔和視圖的all =名字命名。用您的數據庫名稱替換SERVER與您的服務器和DATABASE

你可以在這裏找到有關視圖的更多信息:

https://wiki.apache.org/couchdb/Introduction_to_CouchDB_views

3

你可以看看relational-pouch這樣的事情。否則你可以做「每個用戶3個數據庫」。 ;)

0

我可能不完全明白你在這裏需要什麼,但總的來說,你可以在CouchDB/Cloudant/PouchDB中以3種不同的方式實現你所描述的內容。

  1. 每人一個文件(彼得約翰)。當然 - 如果集合不是巨大的,更重要的是,如果它們不是由不同的用戶同時更新(或者在不同的數據庫實例中更糟),那麼在JSON中只是每個集合的一個元素,持有一個數組,並且可以操縱一切只有一個文件。使訪問輕而易舉。
  2. 每個集合的單個文檔(Peter History,Peter Settings等)。類似的約束,但您可以創建一個文檔來保存每個集合。如果它們不會經常同時修改,那麼您將擁有一個Peter's History的文檔,另一個是Peter's Settings的文檔。
  3. 單個文檔每個項目。這是最好的穀物方法 - 很多小的簡單文檔,每個文檔都包含一個元素(比如Peter的單個歷史記錄)。代碼變得稍微簡單一些,因爲刪除項目成爲刪除項目,許多客戶端可以同時更新項目,但現在您依賴視圖將所有項目都放入列表中。例如,使用鍵[person,listName,item]的視圖可以讓你訪問你想要的東西。

通常,您的數據模式決策歸結爲併發性。你提到PouchDB,所以你可能有一個單線程客戶端,選項1很好很容易?

相關問題