【发布时间】:2015-05-06 14:24:12
【问题描述】:
情况是这样的:
我们有一系列共享一些文档的用户。他们可以共享的文档可能会在一天中发生变化,文档本身也会发生变化(更改和删除)。用户可以更改文档上的一些信息。
例如
用户 |文件
一个 | X
一个 |是的
一个 | Z
乙| X
乙| Z
C |是的
可能的组:A+C、A+B
CouchDB 上的服务器是具有此数据的 SQL Server DB 的副本,ETL 负责管理 CouchDB 上的更改。但是,CouchDB 数据库通过 PouchDB 复制到每个用户手机上。
目标:
相应地复制更改和删除。
我们尝试过的:
1)我们认为我们应该用可以访问它的用户列表来构建我们的文档。每个文档都有一个“用户”数组,然后设计文档中的过滤器将负责复制到客户端。不幸的是,_changes 提要中不存在无法通过过滤器的文档删除和文档更改(例如,从数组中删除了用户),因此无法在客户端上相应地复制
2) 每个用户的数据库。这是不可能的,因为用户需要看到彼此在文档上的工作(他们共享文档)
3) 每组用户的数据库。与第一个解决方案几乎相同的问题,但更糟。事实上:
- 用户组可以更改并且不再存在:如何反映客户端?
- 一个文件可以转移到一个新的组:它必须从头开始重新下载。这大大增加了下载大小
- 同一个文档可以在多个组中! (见上面的例子)
- 每个客户每次登录并复制多个数据库时都必须知道她在哪个组中。然后在回程中,您必须知道文档存在于哪些数据库中
这种情况有解决办法吗?我错过了一个明显的解决方案吗?
编辑
案例1的部分解决方案:
localDB.sync(remoteDB, {
live: true,
retry: true,
filter: 'app/by_user',
query_params: { "agente": agent }
})
.on('paused', function(info){
console.log("paused");
localDB.allDocs().then(function(docs){
console.log("allDocs");
docs.rows.forEach(function(row){
console.log(row);
remoteDB.get(row.id)
.then(function(doc){
if(doc.Agents.indexOf(agent) < 0){
localDB.remove(doc);
}
});
});
});
})
.on('change', function(result){
console.log("change!");
result.change.docs.forEach(function(change) {
if(!change.deleted){
$rootScope.$apply(function(){
$rootScope.$broadcast('upsert', change);
});
}
});
});
每个 remove() 都会给我一个 409(冲突),这是理所当然的。有没有办法告诉 Pouch“不再认为这是可复制的,只需将其从我的数据库中删除?”
【问题讨论】:
-
您可能还想尝试在#couchdb IRC 会议室提出这个问题。他们在此类复杂的权限系统方面拥有更多经验。
-
这是个好建议。下周我们还将见到一位离线优先应用程序的顾问。希望他能有一些见解。
标签: couchdb replication database-replication pouchdb recipe