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

17

从Mongo切换到PouchDB(与Cloudant一起使用),我喜欢“每个用户一个数据库”的概念,但是否有办法在一个数据库中创建多个集合/表?

示例

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

etc...

3个回答

27

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

让我们拓展map函数:

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


我喜欢那个想法。我正在考虑类似的事情。你认为在 _id 字段中加入前缀,如 "users:4711" 的想法如何?这样一来,您就可以创建类似仓库的查询,例如 findUserById(userId) - Serbroda

5
你可以考虑使用 relational-pouch 来实现这样的功能。或者你可以为每个用户使用“3个数据库”。 ;)

1

我可能不完全理解你在这里需要什么,但通常在CouchDB / Cloudant / PouchDB中,您可以通过3种不同的方式实现您所描述的内容。

  1. 每个人(Peter,John)一个文档。当集合不是巨大的,并且更重要的是如果它们没有被不同的用户同时更新(或更糟糕的是在不同的数据库实例中),导致冲突,那么在JSON中只需为每个集合保留一个元素,保存一个数组,您可以使用一个文档操作所有内容。使访问变得轻松。
  2. 每个集合一个文档(Peter History,Peter Settings等)。类似的约束,但您可以创建一个文档来保存这些集合中的每一个。只要它们不经常被同时修改,那么您将会有一个用于Peter的历史记录的文档,以及另一个用于Peter的设置的文档。
  3. 每个项目一个文档。这是最精细的方法 - 许多包含一个元素的小而简单的文档(例如Peter的单个历史记录条目)。代码变得稍微简单一些,因为删除项目变成了删除,许多客户端可以同时更新项目,但现在您取决于视图将所有项目带入列表中。例如,具有键[person,listName,item]的视图将让您访问您想要的内容。
一般来说,您的数据模式决策取决于并发性。您提到了PouchDB,因此可能您有一个单线程客户端,选项1会更加简单易行?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接