Репликация по запросу с фильтром Couchbase Lite

У меня есть андроид и веб-приложения. Приложение 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

Что мне не хватает?


person Mohru    schedule 26.06.2016    source источник


Ответы (2)


Отфильтрованные опрашивающие репликации с помощью Sync Gateway основаны на каналах (см. документацию). Вы можете создать канал для каждого имени пользователя. Функция синхронизации может отображать каждый документ в канал, названный в честь свойства username:

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

Вы можете создать канал для каждого пользователя на Sync Gateway. Нет ограничений на количество каналов или документов, которые можно создать.

PS: Отфильтрованные опрашивающие репликации с функцией фильтрации не поддерживаются в Couchbase Sync Gateway.

person jamiltz    schedule 27.06.2016
comment
Привет, @jamiltz! Я обновил свой вопрос и был бы признателен, если бы вы могли на него взглянуть. - person Mohru; 28.06.2016

В этом случае вам следует использовать каналы. Для каждого документа укажите свойство с именем channels, и каналы должны быть уникальными для каждого пользователя. Теперь, когда вы извлекаете документ, вы можете указать шлюзу синхронизации, из какого канала извлекать. Так что в основном вы можете тянуть из разных каналов (динамическое вытягивание).

Помните, что при настройке свойства каналов это массив строк, а не одна строка

person Legendary_Hunter    schedule 27.06.2016