CouchDB筛选复制-删除文档

CouchDB筛选复制-删除文档,couchdb,replication,Couchdb,Replication,我正在尝试在主数据库和用户数据库之间设置筛选复制。 主控中的文档包含对文档具有权限的用户组列表 { _id: 'one', groups: ['a', 'b'] } { _id: 'two', groups: ['c', 'd'] } 我创建了一个数据库的过滤视图,该视图只允许该组的用户获取复制文档的副本(在本例中,对“a”组进行硬编码) 然后,我在_replicator数据库中创建一个复制文档 { source: "master", target: "user1",

我正在尝试在主数据库和用户数据库之间设置筛选复制。 主控中的文档包含对文档具有权限的用户组列表

{
  _id: 'one',
  groups: ['a', 'b']
}

{
  _id: 'two',
  groups: ['c', 'd']
}
我创建了一个数据库的过滤视图,该视图只允许该组的用户获取复制文档的副本(在本例中,对“a”组进行硬编码)

然后,我在_replicator数据库中创建一个复制文档

{
  source: "master",
  target: "user1",
  filter: "replication/user",
  query_params: {group: "a"},
  create_target: true
}
创建此文档后,复制开始,文档“一”从master复制到user1。文档“2”没有被复制-这正是我想要的

随后,用户从组“a”移动到组“c”,因此我创建了一个新的复制文档:

{
  source: "master",
  target: "user1",
  filter: "replication/user",
  query_params: {group: "c"},
  create_target: true
}
我想要的行为是从用户数据库中删除文档“一”,并复制文档“二”。碰巧文档“一”保留下来,文档“二”被复制。显然,复制筛选器不允许在目标数据库中删除,除非在源数据库中删除文档


那么该如何处理这种情况呢?或者我应该考虑其他结构吗?

据我所知,无法使用复制修改文档。但你可以采取两种方法

首先,您可以创建一个新的数据库并复制到其中。例如,如果您的查询参数更改为
user c
,而不是将其复制到
user1
中,请创建另一个数据库
some name
,并复制到该数据库中,然后删除原始数据库(或者保留该数据库,以防再次查询参数更改)。您甚至可以为源数据库使用描述性名称,如“user1\u filter\u a”。这是最省事的方法,但如果文档数量大且重叠(如大量属于a组和c组的用户b),并且您的replicator筛选器快速更改,则效率可能会很低

另一种方法是使用
视图
和。首先创建一个视图,
根据group字段发出文档,如下所示

function map(doc){

     emit(doc.groups,doc._id);

  } 
然后用

startkey=[“a”]&endKey=[“a”,{}]&include\u docs=true

获取要删除的所有文档。然后迭代结果集并追加
doc.\u deleted=true
发送到每个文档,并向数据库发出批量请求。所有文档都将被删除(更多说明)。此方法的优点是您可以保留单个数据库


简言之,如果您想保留单个数据库,您必须手动删除文档。但是,如果您对基于replicator功能的多个数据库开放,那么每次更改过滤器时,您都可以创建一个新的数据库。

这是一个棘手的问题。我们考虑的方案有:

  • 当组更改时,复制文档并将新组保存到副本中,然后删除原始组。删除操作将通过过滤器传播,并从远程数据库中删除。缺点是如果ID是从其他文档引用的,则会丢失修订和破损
  • 让用户数据库编写一个清单文件,列出数据库中的所有文档,并将其同步回主数据库(我们已经用它来跟踪文档交付和读取状态)。将其与预期的(过滤的)文档列表进行比较,并告诉用户数据库清除(而不是删除)不应再存在的文档

  • 我找到的最好的参考资料是:

    当你说“用户从a组移动到c组”时,这是否意味着
    组的
    更改为
    [“c”,“b”]
    ,用于
    \u id:“一”
    ?@AkshatJiwanSharma否我的意思是在复制文档的查询参数中为用户指定的组从“a”更改为“c”。该文档指定了用户所在的组-它可以更改为couchdb用户角色-但我不确定这会有什么区别。谢谢,这真的很有用-特别是关于批量文档api的信息,因为我不知道-谢谢!
    function map(doc){
    
         emit(doc.groups,doc._id);
    
      }