如何在同步网关couchbase

时间:2016-05-04 20:14:20

标签: couchbase couchbase-lite couchbase-sync-gateway

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

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

现在这只适用于ID = 4。如何使我的同步功能动态化。有没有办法可以为我的同步功能提供参数?

编辑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());
    }*/
    }

1 个答案:

答案 0 :(得分: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,第三个转移到两个。您不需要使频道名称与用户名相同,但对于这种情况,这是最简单的方法。

可以通过Sync Gateway Admin REST API对用户进行编程的频道分配,请参阅http://developer.couchbase.com/documentation/mobile/1.2/develop/references/sync-gateway/admin-rest-api/user-admin/post-user/index.html。 (请注意,Admin API应该在仅对CB运行的本地服务器打开的端口上运行,而不是对公众运行。)