1

我有安卓和网络应用程序。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()但它只插入查看函数)。

我用 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

我错过了什么?

4

2 回答 2

0

您应该为此用例使用通道。对于每个文档,给出一个名为的属性channels,并且通道对于每个用户来说应该是唯一的。现在,当您拉取文档时,您可以告诉同步网关从哪个通道拉取。所以基本上你可以从不同的渠道拉(动态拉)。

请记住,在设置通道属性时,它是一个字符串数组,而不仅仅是一个字符串

于 2016-06-27T14:07:54.713 回答
0

使用 Sync Gateway 的过滤拉取复制基于通道(请参阅文档)。您可以为每个用户名创建一个频道。同步函数可以将每个文档映射到以用户名属性命名的通道:

function (doc, oldDoc) {
  channel(doc.username);
}

您可以在 Sync Gateway 上为每个用户创建一个频道。可以创建多少个频道或一个可以包含多少个文档没有限制。

PS:Couchbase Sync Gateway 不支持具有过滤功能的过滤拉取复制。

于 2016-06-27T12:12:06.430 回答