Синхронизация каналов шлюза в PouchDB

Есть ли поддержка «Каналов» Couchbase Sync Gateway в Pouch DB? Я хотел бы, чтобы пользователи могли видеть подмножество общих данных, и если они создают новые данные, чтобы иметь возможность поделиться тем, с кем они делятся ими.

Возможно ли это с PouchDB? Или мне нужно будет напрямую взаимодействовать с сервером или использовать для мобильных устройств версию Couchbase lite?


person user3546902    schedule 17.04.2014    source источник


Ответы (4)


Небольшое обновление: теперь это возможно, PouchDB (начиная с версии V3.4.0) теперь совместим со шлюзом синхронизации.

См. учебник здесь: http://blog.couchbase.com/first-steps-with-pouchdb--sync-gateway-todomvc-todolite

person Thiago F. Alencar    schedule 27.04.2015

Вот решение, позволяющее клиенту pouch db работать с Couchbase Sync Gateway по каналам пользователя:

var sync = function () {
    var opts = {
        live: true,
        retry: true,
        //-- from here
        filter: "sync_gateway/bychannel",   
        query_params: {
            "channels": channels
        }
        //-- to here
    };

    database.sync(syncServer, opts);
}

Ключевым моментом здесь является то, что вы просто передаете фильтр и параметры запроса как есть, Sync Gateway в любом случае имеет возможность понять этот фильтр.

person Maqbool Ahmed    schedule 18.08.2016
comment
что если канал на юзере изменится? - person jedi; 27.03.2017
comment
@Jedi: у него будет то же поведение, что и у Couchbase Lite, когда локальная база данных начнет получать данные, назначенные для новых каналов, но тогда загвоздка в том, что у вас все еще будут ранее синхронизированные документы, что нежелательно. Итак, чтобы сохранить его в чистоте и порядке, мы очищаем локальную базу данных и выполняем повторную синхронизацию, которая будет получать только данные новых каналов. - person Maqbool Ahmed; 17.07.2017
comment
@MaqboolAhmed, @jedi здесь channels значение ключевых каналов в query_params является строкой или массивом строк? - person K Pal; 03.05.2018
comment
@K Pal: массив строк - person Maqbool Ahmed; 03.05.2018
comment
@KPal согласно документации, каналы — это запятая -разделенный список. - person StCleezy; 04.10.2018
comment
@StCleezy: Вы правы. Однако массив строк также должен работать, поскольку он преобразуется в список, разделенный запятыми, в строке запроса. Ни в коем случае не препятствуя использованию здесь строк, я лично предпочел бы массив, так как это лучший подход для представления нескольких строк. - person Maqbool Ahmed; 23.01.2019

PouchDB создан по образцу CouchDB, в котором нет концепции каналов, поэтому нет планов реализовать ее в PouchDB.

Однако один простой способ решить вашу проблему — синхронизировать PouchDB с CouchDB, а затем синхронизировать его с Couchbase Sync Gateway. Причина, по которой вам понадобится CouchDB в качестве посредника, заключается в том, что есть несколько проблем с прямой синхронизацией PouchDB ‹-> Couchbase Sync Gateway, хотя, надеюсь, они скоро будут решены (см., например, это и это).

person nlawson    schedule 17.04.2014

Синхронизация PouchDB по каналам/отфильтрованная репликация

Вот конкретный пример использования каналов.

var db = new PouchDB("yep");
db.sync(new PouchDB("http://localhost:4984/beer-sample/"), {
    live: true,
    retry: true,
    filter: "sync_gateway/bychannel",
    query_params: {
        channels: "channel-1,channel-2,channel-3,bar"
    }
})

фильтр: sync_gateway/bychannel

Передает имя фильтра для применения к исходным документам. В настоящее время поддерживается только фильтр sync_gateway/bychannel, при этом документы будут реплицироваться только из набора именованных каналов.1

query_params.channels

Вместо передачи массива мы разделяем их запятыми.2

Пример функции синхронизации

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

function sync(doc, oldDoc) {
    if (doc.type == "beer") {
        channel("channel-1");
    } else if (doc.type == "soap") {
        channel("channel-2");
    } else if (doc.type == "sweets") {
        channel("channel-3");
    } else if (doc.type == "bar") {
        channel(doc.type);
    }
}

Хотя и опоздал на 6 лет... Но лучше поздно, чем никогда!

person Miko Chu    schedule 24.07.2020