我有Android和网络应用程序。 Android应用使用Couchbase Lite,网络应用使用Couchbase。我使用Couchbase Sync Gateway在这两个数据库之间启用数据复制。
当用户第一次登录移动应用时,我想使用此特定用户的数据(基于用户名)复制文档。我读到Couchbase Lite (1)支持过滤复制,但我很困惑应该使用哪种方法。
我想做的有点类似于this,所以我想我的过滤功能就像:
function (doc, req) {
if(doc.DocType && doc.DocType == "User" && doc.IsActive && doc.Login == req.query.text)
{ return true }
else
{return false}
}
但是我不知道我应该在哪里创建这个功能(在我的网络应用程序代码中?我发现只有DesignDocument.create()
但它只插入了View函数。)
我读到使用SyncGateway我应该使用频道,但据我所知,基于文档静态属性的频道,我需要使用用户名作为动态参数。
如何设法仅复制此特定文档?
修改。
所以以前我的SyncGateway配置同步属性就像:
"sync":`
function (doc) {
channel (doc.channels);
}`
它没有文件管理器就能正常工作。我把它变成了:
"sync":`
function (doc, oldDoc) {
if(doc.DocType=="User" && doc.IsActive){
channel(doc.Login);
}
else {
channel (doc.channels);
}
}`
我的Java方法是:
public void startFirstLoginReplication(String login, String password) throws CouchbaseLiteException{
(...)
pull = DatabaseManager.getDatabaseInstance().createPullReplication(this.createSyncURL(false));
List<String> channels = new ArrayList<String>();
channels.add(login);
pull.setChannels(channels);
pull.setContinuous(false);
pull.start();
progressDialog = showLoadingSpinner();
pull.addChangeListener(this);
}
通过正常复制,当它被更新时,调用了方法changed()
。使用过滤器不是,没有任何东西被拉动,progressDialog被卡住了。
在SyncGateway控制台中,我得到:
2016-06-27T23:45:46.081+02:00 HTTP: #003: GET /kris_mobile_db/_local/01ef0a1ec2301f9f9f3bb2fae9d352d26fd4a9a7
2016-06-27T23:45:46.094+02:00 HTTP: #003: --> 404 missing (14.5 ms)
2016-06-27T23:45:46.300+02:00 HTTP: #004: POST /kris_mobile_db/_changes
2016-06-27T23:45:46.301+02:00 Changes: MultiChangesFeed({Mo}, {Since:0 Limit:0 Conflicts:true IncludeDocs:false Wait:false Continuous:false Terminator:0xc08245cba0 HeartbeatMs:300000 TimeoutMs:300000}) ...
2016-06-27T23:45:46.301+02:00 Changes+: MultiChangesFeed: channels expand to channels.TimedSet{"Mo":0x1} ...
2016-06-27T23:45:46.301+02:00 Changes+: MultiChangesFeed sending &{Seq:1 ID:_user/GUEST Deleted:false Removed:{} Doc:map[] Changes:[] Err:<nil> branched:false}
2016-06-27T23:45:46.302+02:00 Changes: MultiChangesFeed done
我错过了什么?
答案 0 :(得分:0)
使用Sync Gateway过滤的拉式复制基于通道(see the docs)。您可以为每个用户名创建一个频道。同步功能可以将每个文档映射到以用户名属性命名的通道:
function (doc, oldDoc) {
channel(doc.username);
}
您可以在Sync Gateway上为每个用户创建一个频道。对于可以创建的通道数量或可以包含的文档数量没有限制。
PS:Couchbase Sync Gateway不支持使用过滤功能的过滤拉式复制。
答案 1 :(得分:0)
您应该为此用例使用频道。对于每个文档,给出一个名为channels
的属性,并且每个用户的通道应该是唯一的。现在,当您提取文档时,您可以告诉同步网关从哪个渠道提取。所以基本上你可以从不同的渠道拉动(动态拉动)。
请记住,在设置渠道属性时,它不仅是一个字符串数组