我可以在每个数据库中创建多个集合吗?

问题描述 投票:11回答:3

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

示例

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

等...

couchdb pouchdb cloudant
3个回答
16
投票

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

实质上,此地图功能是说仅将类型==“ Friend”的文档与该视图关联。现在,我们可以查询此视图,并且只会返回朋友:

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. 每个集合一个文档(彼得历史记录,彼得设置等)。约束类似,但是您可以创建一个文档来保存每个集合。如果它们不会经常被同时修改,那么您将拥有一个有关“彼得的历史”的文档,以及一个有关“彼得的设置”的文档。
  3. 每个项目一个文件。这是最好的方法-许多小型简单文档,每个文档包含一个元素(例如,Peter的单个History条目)。代码变得稍微简单些,因为删除项目变成删除操作,并且许多客户端可以同时更新项目,但是现在您依靠Views将所有项目都放入列表中。例如,带有键[person,listName,item]的视图将允许您访问所需的内容。

通常,您的数据架构决策取决于并发性。您提到了PouchDB,所以可能是您有一个单线程客户端,而选项1很好也很容易?

© www.soinside.com 2019 - 2024. All rights reserved.