PouchDB:多个远程数据库,单个本地数据库(花哨复制)

时间:2015-03-12 14:00:48

标签: couchdb pouchdb

我有一个管理用户的pouchdb应用程序。

用户拥有一个本地pouchDB实例,可以使用一个couchDB数据库进行复制。很简单。

这是事情变得有点复杂的地方。我在我的设计中引入了“群体”的概念。组将是不同的couchDB数据库,但在本地,它们应该是用户数据库的一部分。

我在pouchDB网站上阅读了一些关于“花哨复制”的内容,这似乎是我追求的解决方案。

现在,我的问题是,我该怎么做?更具体地说,如何从多个远程数据库复制到一个本地数据库?一些代码示例将是超级的。

从下面的图表中,您会注意到我需要根据用户所在的群组动态添加数据库。对我的设计的批评也将受到赞赏。 谢谢!

enter image description here

流程应该是这样的:

  1. 从他/她的数据库中检索所有用户文档到localUserDB
  2. var groupDB = new PouchDB('remote-group-url'); groupDB.replicate.to(localUserDB);
    (多个pouchdb实例0_0的任何性能问题?)
  3. 在本地,当用户进行与特定组相关的更改时,我们确定相应的数据库并通过执行以下操作进行复制:
    localUserDB.replicate.to(groupDB)(我是否需要过滤复制?)
  4. 编辑: Nolan建议我查看couchDB“角色”系统来解决我的问题。一旦我搞清楚,我会在这里发帖。

1 个答案:

答案 0 :(得分:11)

从许多远程数据库复制到本地数据库:

remoteDB1.replicate.to(localDB);
remoteDB2.replicate.to(localDB);
remoteDB3.replicate.to(localDB);
// etc.

然后从本地数据库中执行过滤复制到应该接收更改的远程数据库:

localDB.replicate.to(remoteDB1, {
  filter: function (doc) {
    return doc.shouldBeReplicated;
  }
});

为什么要过滤复制?因为您的本地数据库包含来自许多来源的文档,并且您不希望将所有内容复制回一个远程数据库。

为何选择过滤功能?由于您从本地数据库复制,因此使用设计文档,视图等无法获得性能提升。只需传入过滤函数;它更简单。 :)

希望有所帮助!

编辑:好吧,听起来用户所属的群组名称实际上包含在第一个数据库中,这就是“迭代”的含义。不,你可能不应该这样做。 :)您正试图绕过CouchDB的内置身份验证/权限系统。

相反,您应该使用CouchDB的内置角色,将这些角色应用于用户,然后使用“每个角色的数据库”方案,以确保用户只能访问其正确的组DB。用户始终可以查询_users API以查看他们所属的角色。简单!

有关详细信息,请阅读pouchdb-authentication README