Как динамически изменить функцию синхронизации в кушетке шлюза синхронизации

Есть ли способ динамически изменять функцию синхронизации, например. Допустим, у моих документов есть идентификатор поля, и я хочу получить документы, принадлежащие определенному идентификатору, поэтому идентификатор — это моя переменная здесь. например. ниже функция синхронизации для ID=4

"sync":
    function (doc) {
        if(doc.ID==4){
            channel (doc.channels);
        }
        else{
            throw({forbidden: "Missing required properties"});
        }
    }, 

Теперь это будет работать только для ID = 4. Как я могу сделать свою функцию синхронизации динамической. Есть ли способ предоставить аргументы моей функции синхронизации?

EDIT 1 Добавлен вариант использования

Итак, мой вариант использования такой. У меня есть приложение, в котором, когда пользователь входит в систему, мне нужно получить пользовательские данные с CouchBase Server на CouchBase lite. На моем сервере CouchBase у меня есть 20000 документов, и для каждого пользователя есть 5 документов, поэтому у меня (20000/5) 4000 пользователей. Итак, когда пользователь входит в мое приложение, мой сервер CouchBase должен отправлять только 5 документов, связанных с этим пользователем, а не все 20000 документов.

ИЗМЕНИТЬ 2

Вот как я реализовал репликацию

private URL createSyncURL(boolean isEncrypted){
    URL syncURL = null;
    String host = "http://172.16.25.108";
    String port = "4986";
    String dbName = "sync_gateway";
    try {
        //syncURL = new URL("http://127.0.0.1   :4986/sync_gateway");
        syncURL = new URL(host + ":" + port + "/" + dbName);
    } catch (Exception me) {
        me.printStackTrace();
    }
    Log.d(syncURL.toString(),"URL");
    return syncURL;
    }
    private void startReplications() throws CouchbaseLiteException {
    Log.d(TAG, "");
    Replication pull = database.createPullReplication(this.createSyncURL(false));
    Replication push = database.createPushReplication(this.createSyncURL(false));
    Authenticator authenticator = AuthenticatorFactory.createBasicAuthenticator("an", "1234");
    pull.setAuthenticator(authenticator);
    //push.setAuthenticator(authenticator);
    List<String> channels1 = new ArrayList<String>();
    channels1.add("u1");
    pull.setChannels(channels1);
    pull.setContinuous(true);
       // push.setContinuous(true);
    pull.start();
    //push.start();
    if(!push.isRunning()){
        Log.d(TAG, "MyBad");
    }
    /*if(!push.isRunning()) {
        Log.d(TAG, "Replication is not running due to " +push.getLastError().getMessage());
        Log.d(TAG, "Replication is not running due to " +push.getLastError().getCause());
        Log.d(TAG, "Replication is not running due to " +push.getLastError().getStackTrace());
        Log.d(TAG, "Replication is not running due to " +push.getLastError().toString());
    }*/
    }

person Legendary_Hunter    schedule 04.05.2016    source источник
comment
Чего вы хотите добиться этими параметрами? Ваша функция синхронизации будет применяться к каждому вставленному, измененному или удаленному документу. Он будет работать сам по себе, поэтому вы не сможете вызвать его извне, чтобы передать ему какие-то новые значения аргументов. У него будет весь документ для обработки, но больше ничего. Так когда и откуда должны исходить аргументы?   -  person TAM    schedule 05.05.2016
comment
Я добавил больше пояснений. Пожалуйста, вернитесь назад, если вы не поняли, я добавлю примеры для большей ясности   -  person Legendary_Hunter    schedule 05.05.2016


Ответы (1)


Самый простой способ добиться этого — присвоить каждому пользователю один канал, названный так же, как и пользователь, и присвоить документу имена каналов (= пользователей) всех пользователей, для которых этот документ актуален (может быть, только одно имя канала для каждого документа). , но это полностью зависит от вас).

Таким образом, со стандартной функцией синхронизации (без каких-либо условий if), если ваш config.json содержит

        "users": {
            "u1": {
                "admin_channels": ["u1"],
                "password": "abracadabra"
            },
            "u2": {
                "admin_channels": ["u2"],
                "password": "simsalabim"
        ...

и у вас есть документы, имеющие

{"channels": "u1",...

{"channels": "u2",...

{"channels": ["u1", "u2"],...

то первый перейдет к u1, второй к u2, а третий к ним обоим. Вам не нужно делать имена ваших каналов идентичными имени пользователя, но для этого сценария это самый простой способ.

Программное назначение каналов пользователям можно выполнить через REST API администратора Sync Gateway, см. http://developer.couchbase.com/documentation/mobile/1.2/develop/references/sync-gateway/admin-rest-api/user-admin/post-user/index.html. (Обратите внимание, что Admin API должен работать на порту, который открыт только для локального сервера, на котором работает CB, а не для общего доступа.)

person TAM    schedule 06.05.2016
comment
Но проблема в том, что в настоящее время у меня около 4000 пользователей, поэтому мне нужно создавать 4000 каналов вручную? и больше пользователей будет регистрироваться, поэтому всякий раз, когда пользователь регистрируется, мне нужно вручную создавать канал этого пользователя? Нет ли какой-нибудь автоматизированной системы для создания каналов? - person Legendary_Hunter; 06.05.2016
comment
Расширил этот ответ, чтобы охватить и это. - person TAM; 06.05.2016
comment
Привет, ТАМ. Я использовал описанный выше метод и могу направлять свои документы. Но когда я использую API для создания пользователей, я не могу вытащить свои документы (Push работает). Я получаю следующую ошибку PullerInternal{unknown, pull, 93166}: Received invalid doc ID from _changes: {seq=4, id=_user/an, changes=[]}, и на cosol syncgateway он постоянно работает без остановки. Я имею в виду, что вижу бесконечный запрос POST для одного и того же документа и работает - person Legendary_Hunter; 09.05.2016
comment
Возможно, вы вставили или изменили документы в корзине, администрируемой Sync Gateway напрямую, т. е. не используя REST API Sync Gateway? Таким образом, вы могли повредить структуры данных SG. - person TAM; 09.05.2016
comment
НЕТ. Я вставляю его только через шлюз синхронизации. Я очень хорошо осведомлен о том, что работа напрямую может повредить шлюз синхронизации. Я также добавил код, который я использую для репликации, и единственным различием в двух методах является то, как я создаю пользователей. Когда я создаю пользователей непосредственно в конфигурационном файле, я готов к работе, но когда я использую REST API (api шлюза синхронизации для создания пользователей), у меня возникает проблема с репликацией по запросу. - person Legendary_Hunter; 09.05.2016
comment
Аналогичная проблема обсуждается в forums.couchbase.com/t/. - person TAM; 09.05.2016
comment
Моя проблема немного в другом. Моя проблема заключается в том, что когда я жестко кодирую пользователей в файле конфигурации шлюза синхронизации, все в порядке, но когда я использую REST API для создания пользователей, я не могу извлекать данные - person Legendary_Hunter; 09.05.2016
comment
Теперь я нашел свою проблему, пожалуйста, обратитесь к следующему forums.couchbase.com/t/ напишите и помогите мне, если можете - person Legendary_Hunter; 10.05.2016
comment
Я предполагаю, что такого рода проблемы хорошо представлены на форуме CB, и ребята там более компетентны, когда дело доходит до внутренних ошибок, чем я. - person TAM; 10.05.2016