我能为每个数据库创建多个集合吗?

时间:2016-04-28 11:26:41

标签: couchdb pouchdb cloudant

从mongo切换到pouchdb(使用Cloudant),我喜欢"每个用户一个数据库"概念,但有没有办法为每个数据库创建多个集合/表?

实施例

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

等...

由于

3 个答案:

答案 0 :(得分:15)

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);
  }
}

本质上,这个map函数只是说文档与这个类型为==“Friend”的视图相关联。现在,我们可以查询此视图,只返回朋友:

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

其中friends =设计文档的名称,all =视图的名称。将SERVER替换为您的服务器,将DATABASE替换为您的数据库名称。

您可以在此处找到有关视图的更多信息:

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

答案 1 :(得分:3)

您可以查看relational-pouch这样的内容。另外,你可以为每个用户做3个数据库。&#34; ;)

答案 2 :(得分:0)

我可能无法完全理解您的需求,但总的来说,您可以在CouchDB / Cloudant / PouchDB中以3种不同的方式实现您所描述的内容。

  1. 每人一份文件(彼得,约翰)。当然 - 如果集合不是巨大的,更重要的是如果它们不是由不同的用户同时更新(或者更糟糕的是在不同的数据库实例中)导致冲突,那么在JSON中只是每个集合的一个元素,持有一个数组,你可以操纵一切只有一个文件。使访问变得轻而易举。
  2. 每个集合的单个文档(Peter History,Peter Settings等)。类似的约束,但您可以创建一个文档来保存每个集合。如果他们不会经常同时修改,那么你就会有一份Peter的历史文件,另一份是Peter的设置文件。
  3. 每个项目单个文档。这是最好的颗粒方法 - 许多小的简单文档,每个文档包含一个元素(比如Peter的单个History条目)。代码变得稍微简单,因为删除项目变为删除,许多客户端可以同时更新项目,但现在您依赖于视图将所有项目放入列表中。例如,使用键[person,listName,item]的视图可以访问您想要的内容。
  4. 通常,您的数据模式决策归结为并发。你提到PouchDB所以你可能有一个单线程客户端,而选项1很简单吗?