我正在尝试在主数据库和用户数据库之间设置筛选复制。主文档中包含对文档具有权限的用户组列表。
{
_id: 'one',
groups: ['a', 'b']
}
{
_id: 'two',
groups: ['c', 'd']
}我创建了一个经过筛选的数据库视图,该视图只允许与组一起的用户获得复制文档的副本(在本例中硬编码“a”组)
{
filters = {
users = function(doc, req){
return doc.groups.indexOf(req.query.group) != -1;
}
}
}然后在_replicator数据库中创建一个复制文档。
{
source: "master",
target: "user1",
filter: "replication/user",
query_params: {group: "a"},
create_target: true
}创建此文档后,复制开始,文档“one”将从主文档复制到user1。文档“二”没有复制--这正是我想要的。
随后,用户从组'a‘移到组'c’,因此我创建了一个新的复制文档:
{
source: "master",
target: "user1",
filter: "replication/user",
query_params: {group: "c"},
create_target: true
}我想要的行为是从用户数据库中删除文档“one”,并复制文档“2”。正因为如此,文档“一”和“二”被复制。显然,除非在源数据库中删除文档,否则复制筛选器不允许在目标数据库中删除。
那么,应该如何处理这种情况呢?还是我应该考虑另一种结构?
发布于 2014-06-02 17:46:56
据我所知,无法使用复制修改文档。但是有两种方法你可以采取。
首先,您可以创建一个新的数据库并复制到它。例如,如果查询参数更改为user c,而不是将其复制到user1,则创建另一个数据库some name并复制到它,然后删除原始数据库(或者保留它,以防再次发生查询参数更改)。您甚至可以为源数据库使用描述性名称,如"user1_filter_a“。这是最麻烦的免费方式,但如果文档数量大且重叠(就像属于a和c组的大量用户b)和复制者过滤器变化迅速,则效率可能会很低。
另一种方法是使用view和大容量文档api。首先创建一个视图,使emits文档基于组字段,如下所示
function map(doc){
emit(doc.groups,doc._id);
} ,然后查询
startkey=["a"]&endKey=["a",{}]&include_docs=true
若要获取要删除的所有文档,请执行以下操作。然后遍历结果集,并将doc._deleted=true追加到每个文档中,并向数据库发出批量请求。所有的文档都将被删除(更多的解释是这里),这种方法的.The优点是可以保留一个数据库。
简而言之,如果您想要保留一个数据库,就必须手动删除这些文档。但是,如果您基于复制器函数向多个数据库开放,则可以在每次筛选器更改时创建一个新数据库。
发布于 2016-02-17 05:15:29
这是个棘手的话题。我们所考虑的方案如下:
我找到的最好的参考资料是:http://pouchdb.com/2015/04/05/filtered-replication.html
https://stackoverflow.com/questions/23983739
复制相似问题