Couchdb 多个远程数据库,单个本地数据库(奇特的复制)
我有一个管理用户的数据库应用程序 用户有一个本地PockDB实例,它可以与单个CouchDB数据库进行复制。很简单 这就是事情变得有点复杂的地方。我将“组”的概念引入到我的设计中。组将是不同的CouchDB数据库,但在本地,它们应该是用户数据库的一部分 我在PockDB网站上读了一些关于“奇特复制”的文章,这似乎就是我想要的解决方案 现在,我的问题是,我该怎么做?更具体地说,如何从多个远程数据库复制到单个本地数据库?一些代码示例将非常有用 从下面的图表中,您会注意到我需要根据用户所在的组动态添加数据库对我的设计提出批评也将不胜感激。 流程应该是这样的:Couchdb 多个远程数据库,单个本地数据库(奇特的复制),couchdb,pouchdb,Couchdb,Pouchdb,我有一个管理用户的数据库应用程序 用户有一个本地PockDB实例,它可以与单个CouchDB数据库进行复制。很简单 这就是事情变得有点复杂的地方。我将“组”的概念引入到我的设计中。组将是不同的CouchDB数据库,但在本地,它们应该是用户数据库的一部分 我在PockDB网站上读了一些关于“奇特复制”的文章,这似乎就是我想要的解决方案 现在,我的问题是,我该怎么做?更具体地说,如何从多个远程数据库复制到单个本地数据库?一些代码示例将非常有用 从下面的图表中,您会注意到我需要根据用户所在的组动态添加
localUserDB
var-groupDB=new-backdb('remote-group-url')代码>
groupDB.replicate.to(localUserDB)代码>
(多个数据库实例0_0有任何性能问题?)
localUserDB.replicate.to(groupDB)
(我需要过滤复制吗?)从多个远程数据库复制到本地数据库:
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的内置角色,将这些角色应用于用户,然后使用“每个角色数据库”方案确保用户只能访问其适当的组数据库。用户始终可以查询\u用户
API以查看他们所属的角色。简单
有关更多详细信息,请阅读。Nolan!为了确保我的理解正确,流程如下:1)从他/她的数据库中检索所有用户文档2)当遇到类型为group的文档时:
var groupDB=new-pockdb('remote-group-url')
(这里有性能问题吗?groupDB.replicate.to(localUserDB)代码>3)在本地,当用户做出与特定组相关的更改时,我们通过执行以下操作来确定相应的数据库并进行复制:localUserDB.replicate.to(groupDB)
(对于在本例中何时使用过滤复制有点困惑)我的流有意义吗?谢谢,我为这段文字道歉,但堆栈溢出似乎不允许在注释中换行。另外,stack overflow显然不允许您在五分钟后编辑您的评论0\u 0I将我的无法阅读的块评论添加到图像下方的问题本身,我不太理解您的问题:(您肯定不想使用allDocs()
迭代所有文档,并尝试自己复制文档(例如使用put()
或其他手动方法)。只需使用replicate()即可
API在数据库之间进行复制,必要时进行过滤…如果您跳上Freenode PockDB IRC频道,可能会更容易提供帮助。您了解角色系统了吗?是的,基本上在\u用户
数据库中,我最终使用了每个数据库一个角色。我在用户的r中定义了用户可以访问的数据库名称OLE Es/Copy>每个用户文档上的数组。让我知道如果你有任何更具体的问题,我会很乐意帮助,因为我花了相当多的时间在这方面。你是如何建立用户数据库之间的同步的?如果你正在挣扎,考虑使用很多本地DBS,因为有远程的。如果一次连接了1个(HTTP连接太多),您应该会没事的。请参阅。