【问题标题】:Can I create multiple collections per database?我可以为每个数据库创建多个集合吗?
【发布时间】:2026-02-20 08:55:02
【问题描述】:

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

例子

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

等等……

【问题讨论】:

    标签: couchdb pouchdb cloudant


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      您可以查看relational-pouch 以获取类似的信息。否则,您可以执行“每个用户 3 个数据库”。 ;)

      【讨论】:

        【解决方案3】:

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

        1. 每人一份文件(彼得,约翰)。当然 - 如果集合不是巨大的,更重要的是,如果它们不是由不同的用户同时更新(或更糟的是在不同的数据库实例中)导致冲突,那么在 JSON 中只是每个集合的一个元素,持有一个数组,你可以操纵一切只需一份文件。让访问变得轻而易举。
        2. 每个集合单个文档(彼得历史,彼得设置等)。类似的约束,但您可以创建一个文档来保存这些集合中的每一个。如果它们不会经常同时修改,那么您将有一个文档用于彼得的历史,另一个文档用于彼得的设置。
        3. 每个项目一个文档。这是最细粒度的方法 - 许多小的简单文档,每个文档都包含一个元素(比如 Peter 的单个历史条目)。代码稍微简单一些,因为删除项目变成了删除,并且许多客户端可以同时更新项目,但现在您依赖视图将所有项目放入列表中。例如,带有键 [person, listName, item] 的视图可以让您访问所需的内容。

        通常,您的数据架构决策归结为并发性。您提到 PouchDB,可能是因为您有一个单线程客户端,而选项 1 又好又简单?

        【讨论】:

          最近更新 更多