2016-06-26 111 views
1

我有android和web应用程序。 Android应用使用Couchbase Lite,Web应用使用Couchbase。我正在使用Couchbase Sync Gateway来启用这两个数据库之间的数据复制。Couchbase Lite过滤拉复制

当用户第一次登录到移动应用程序时,我想拉复制该文档与该特定用户(基于用户名)的数据。我读过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 

我缺少什么?

回答

0

带有同步网关的过滤拉复制基于通道(see the docs)。您可以为每个用户名创建一个频道。同步功能可以在每个文件映射到用户名属性命名的通道:

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

您可以创建在同步网关每个用户的信道。对于可以创建多少个通道或者可以包含多少个文档没有限制。

PS:在Couchbase Sync Gateway中不支持带过滤功能的过滤拉复制。

+0

@jamiltz嗨数组!我更新了我的问题,并希望你能看看它。 – Mohru

0

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

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