gpt4 book ai didi

CouchDB 过滤复制 - 删除文档

转载 作者:行者123 更新时间:2023-12-04 15:57:48 24 4
gpt4 key购买 nike

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

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

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

我创建了一个过滤的数据库 View ,它只允许该组的用户获取复制文档的副本(在本例中对“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”从 master 复制到 user1。文件“二”没有被复制——正是我想要的。

随后用户从组 'a' 移动到组 'c',所以我创建了一个新的复制文档:
{
source: "master",
target: "user1",
filter: "replication/user",
query_params: {group: "c"},
create_target: true
}

我想要的行为是从用户数据库中删除文档“一”并复制文档“二”。碰巧文档“一”保留,文档“二”被复制。显然复制过滤器不允许在目标数据库中删除,除非文档在源数据库中被删除。

那么这种情况应该如何处理呢?或者是否有我应该考虑的替代结构?

最佳答案

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

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

另一种方法是使用 viewBulk document api .首先创建一个 View emits像这样基于组字段的文档

function map(doc){

emit(doc.groups,doc._id);

}

然后查询
startkey=["a"]&endKey=["a",{}]&include_docs=true
获取要删除的所有文档。然后迭代结果集并追加 doc._deleted=true到每个文档并向数据库发出批量请求。所有文件都会被删除(更多解释 here)。这种方法的好处是可以保留一个数据库。

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

关于CouchDB 过滤复制 - 删除文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23983739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com