2016-06-26 170 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的屬性,並且渠道對於每個用戶都應該是唯一的。現在,當您拉取文件時,您可以告知同步網關從哪個頻道拉出。所以基本上你可以從不同的渠道拉動(動態拉動)。

請記住,設置通道屬性時,它是一個字符串不僅是一個字符串