如何在同步网关 couchbase 中动态更改同步功能
How to Dynamically change sync function in sync gateway couchbase
有没有办法动态更改同步功能,例如。让 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 个添加的用例
好的,所以我的用例就像 this.I 有一个应用程序,当用户登录时,我需要将用户特定的数据从 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());
}*/
}
实现这一点的最简单方法是使每个用户有资格使用一个频道,并像用户一样命名,并为文档提供与该文档相关的所有用户的频道(= 用户)名称(可能只是每个文档一个频道名称,但这完全取决于您)。
因此使用标准同步功能(没有任何 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 运行s 所在的本地服务器开放的端口上,而不是 public。)
有没有办法动态更改同步功能,例如。让 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 个添加的用例
好的,所以我的用例就像 this.I 有一个应用程序,当用户登录时,我需要将用户特定的数据从 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());
}*/
}
实现这一点的最简单方法是使每个用户有资格使用一个频道,并像用户一样命名,并为文档提供与该文档相关的所有用户的频道(= 用户)名称(可能只是每个文档一个频道名称,但这完全取决于您)。
因此使用标准同步功能(没有任何 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 运行s 所在的本地服务器开放的端口上,而不是 public。)