2016-04-28 236 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很好很容易?

相关问题