首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CouchDB筛选复制-删除文档

CouchDB筛选复制-删除文档
EN

Stack Overflow用户
提问于 2014-06-01 19:42:41
回答 2查看 2.4K关注 0票数 6

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

代码语言:javascript
复制
{
  _id: 'one',
  groups: ['a', 'b']
}

{
  _id: 'two',
  groups: ['c', 'd']
}

我创建了一个经过筛选的数据库视图,该视图只允许与组一起的用户获得复制文档的副本(在本例中硬编码“a”组)

代码语言:javascript
复制
{
  filters = {
    users = function(doc, req){
      return doc.groups.indexOf(req.query.group) != -1;
    }
  }
}

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

代码语言:javascript
复制
{
  source: "master",
  target: "user1",
  filter: "replication/user",
  query_params: {group: "a"},
  create_target: true
}

创建此文档后,复制开始,文档“one”将从主文档复制到user1。文档“二”没有复制--这正是我想要的。

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

代码语言:javascript
复制
{
  source: "master",
  target: "user1",
  filter: "replication/user",
  query_params: {group: "c"},
  create_target: true
}

我想要的行为是从用户数据库中删除文档“one”,并复制文档“2”。正因为如此,文档“一”和“二”被复制。显然,除非在源数据库中删除文档,否则复制筛选器不允许在目标数据库中删除。

那么,应该如何处理这种情况呢?还是我应该考虑另一种结构?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-02 17:46:56

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

首先,您可以创建一个新的数据库并复制到它。例如,如果查询参数更改为user c,而不是将其复制到user1,则创建另一个数据库some name并复制到它,然后删除原始数据库(或者保留它,以防再次发生查询参数更改)。您甚至可以为源数据库使用描述性名称,如"user1_filter_a“。这是最麻烦的免费方式,但如果文档数量大且重叠(就像属于a和c组的大量用户b)和复制者过滤器变化迅速,则效率可能会很低。

另一种方法是使用view大容量文档api。首先创建一个视图,使emits文档基于组字段,如下所示

代码语言:javascript
复制
function map(doc){

     emit(doc.groups,doc._id);

  } 

,然后查询

startkey=["a"]&endKey=["a",{}]&include_docs=true

若要获取要删除的所有文档,请执行以下操作。然后遍历结果集,并将doc._deleted=true追加到每个文档中,并向数据库发出批量请求。所有的文档都将被删除(更多的解释是这里),这种方法的.The优点是可以保留一个数据库。

简而言之,如果您想要保留一个数据库,就必须手动删除这些文档。但是,如果您基于复制器函数向多个数据库开放,则可以在每次筛选器更改时创建一个新数据库。

票数 2
EN

Stack Overflow用户

发布于 2016-02-17 05:15:29

这是个棘手的话题。我们所考虑的方案如下:

  1. 当组更改时,复制文档并将新组保存到副本中,然后删除原件。删除将通过筛选器传播,并从远程DB中删除。缺点是如果ID是从其他文档引用的,则会丢失修订和损坏。
  2. 让用户数据库编写一个清单文件,列出DB中的所有文档,这些文档与主数据库同步(我们已经使用这个文件来跟踪文档传递和读取状态)。将其与预期的(筛选的)文档列表进行比较,并告诉用户数据库清除(而不是删除)不应该出现的文档。

我找到的最好的参考资料是:http://pouchdb.com/2015/04/05/filtered-replication.html

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23983739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档