【问题标题】:How to Dynamically change sync function in sync gateway couchbase如何在同步网关沙发库中动态更改同步功能
【发布时间】:2016-05-04 20:14:19
【问题描述】:

有没有一种方法可以动态更改同步功能,例如。让 ssy 我的文档有一个字段 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 服务器获取用户特定数据到 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());
    }*/
    }

【问题讨论】:

  • 你想通过这些参数实现什么?您的同步功能将应用于每个插入、更改或删除的文档。它会自行运行,所以你不能从外部调用它来为它提供一些新的参数值。它将提供要处理的整个文档,但仅此而已。那么争论应该从何时何地来?
  • 我已经添加了更多解释。如果您不明白,请返回,我将添加示例以更清晰

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


【解决方案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 的本地服务器开放的端口上,而不是对公众开放。)

【讨论】:

  • 但问题是我目前有 4000 个用户,所以我必须手动创建 4000 个频道吗?并且会有更多用户注册,所以每当用户注册时,我必须手动创建该用户的频道?是不是有一些自动化的系统来制作频道?
  • 扩展该答案以涵盖这一点。
  • 嗨,TAM,我使用了上述方法,并且能够对我的文档进行通道化。但是当我使用 API 创建用户时,我无法提取我的文档(推送正在工作)。我收到以下错误PullerInternal{unknown, pull, 93166}: Received invalid doc ID from _changes: {seq=4, id=_user/an, changes=[]} 并且在同步网关的 cosol 上它持续​​运行而不会停止我的意思是我可以看到同一文档的无限 POST 请求并正在运行
  • 您是否在 Sync Gateway 直接管理的存储桶中插入或更改了文档,即未使用 Sync Gateway REST API?那样你可能会破坏 SG 数据结构。
  • 不,我只使用同步网关插入它。我非常清楚直接执行会损坏同步网关的事实。我还添加了用于复制的代码,两种方法的唯一不同在于我创建用户的方式。当我直接在配置文件中创建用户时,我很高兴但是当我使用 REST API(同步网关 api 来创建用户)时,我遇到了拉取复制问题
猜你喜欢
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2018-07-10
  • 2014-08-20
相关资源
最近更新 更多