如何在同步网关couchbase中动态更改同步功能

如何在同步网关couchbase中动态更改同步功能,couchbase,couchbase-lite,couchbase-sync-gateway,Couchbase,Couchbase Lite,Couchbase Sync Gateway,是否有一种方法可以动态更改例如的同步功能。让ssy我的文档有一个字段ID,我想获取属于特定ID的文档,因此ID是我的变量。下面是ID=4的同步功能 "sync": function (doc) { if(doc.ID==4){ channel (doc.channels); } else{ throw({forbidden: "Missing required properties"});

是否有一种方法可以动态更改例如的同步功能。让ssy我的文档有一个字段ID,我想获取属于特定ID的文档,因此ID是我的变量。下面是ID=4的同步功能

"sync":
    function (doc) {
        if(doc.ID==4){
            channel (doc.channels);
        }
        else{
            throw({forbidden: "Missing required properties"});
        }
    }, 
现在这只适用于ID=4。如何使我的同步功能动态化。有没有一种方法可以为sync函数提供参数

编辑1个添加的用例

好的,我的用例是这样的。我有一个应用程序,当用户登录时,我需要从CouchBase服务器到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());
    }*/
    }
专用URL createSyncURL(布尔值已加密){
URL-syncURL=null;
字符串主机=”http://172.16.25.108";
字符串端口=“4986”;
String dbName=“sync\u网关”;
试一试{
//syncURL=新URL(“http://127.0.0.1   :4986/sync_网关);
syncURL=新URL(主机+“:“+端口+”/“+数据库名);
}抓住(我例外){
me.printStackTrace();
}
Log.d(syncURL.toString(),“URL”);
返回syncURL;
}
私有void startReplications()引发CouchbaseLiteException{
Log.d(标记“”);
Replication pull=database.createPullReplication(this.createSyncURL(false));
复制推送=database.createPushReplication(this.createSyncURL(false));
Authenticator Authenticator=AuthenticatorFactory.createBasicAuthenticator(“an”,“1234”);
pull.setAuthenticator(验证器);
//push.setAuthenticator(authenticator);
列表通道1=新的ArrayList();
渠道1.添加(“u1”);
拉动。设置通道(通道1);
pull.setContinuous(真);
//push.setContinuous(true);
pull.start();
//push.start();
如果(!push.isRunning()){
Log.d(标签“MyBad”);
}
/*如果(!push.isRunning()){
Log.d(标记“由于“+push.getLastError().getMessage()”,复制未运行);
Log.d(标记“由于“+push.getLastError().getCause()”,复制未运行);
Log.d(标记“由于“+push.getLastError().getStackTrace()”,复制未运行);
Log.d(标记“由于“+push.getLastError().toString()”,复制未运行);
}*/
}

实现这一点的最简单方法是将每个用户限定为一个频道,名称与用户相同,并向文档提供与此文档相关的所有用户的频道(=用户名)(每个文档可能只有一个频道名称,但这完全取决于您)

因此,如果您的
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为用户编程分配通道,请参阅。(请注意,管理API应在只向CB运行的本地服务器(而不是向公众)打开的端口上运行。)

您希望通过这些参数实现什么?同步功能将应用于每个插入、更改或删除的文档。它将自己运行,所以您不能从外部调用它来为它提供一些新的参数值。它将有整个文档可供处理,但没有其他内容。那么,争论应该从何时何地开始呢?我补充了更多的解释。如果您不理解,请返回,我将添加示例以获得更多澄清。问题是,目前我有4000个用户,所以我必须手动制作4000个频道吗?而且会有更多的用户注册,所以每当一个用户注册时,我就必须手动创建该用户的频道?难道没有一些自动系统来制作频道吗?扩展了这个答案来涵盖这一点。嗨,谭,我使用了上述方法,我能够将我的文档频道化。但当我使用API创建用户时,我无法提取我的文档(推送正在工作)。我得到以下错误
PullerInternal{unknown,pull,93166}:从{u changes:{seq=4,ID={u user/an,changes=[]接收到无效的文档ID}
在syncgateway的cosol上,它正在不停地连续运行。我的意思是,我可以看到对同一文档的无限POST请求,并且正在运行。可能是您直接在syncgateway管理的bucket中插入或更改了文档,即不使用syncgateway REST API吗?这样可能会损坏SG数据结构。不,我仅使用同步网关插入它。我非常清楚这样做会损坏同步网关。我还添加了用于复制的代码,这两种方法唯一不同的是如何创建用户。当我直接在配置文件中创建用户时,我很乐意去做,但当我使用RESTAPI(同步网关API来创建用户)时,我遇到了拉复制问题