【问题标题】:Couchbase Lite pull with filtered replication from CouchDBCouchbase Lite 使用来自 CouchDB 的过滤复制拉取
【发布时间】:2018-05-02 02:58:21
【问题描述】:

我没有设法从 CouchDB 中提取复制数据。

我使用 CouchDB 来存储我的文档。

CouchDB 版本:Apache CouchDB 1.6.1
Couchbase Lite:Couchbase Lite 1.4.0

以下是我的示例数据:

{
   "_id": "ab33deeb074523e3c63c216b8c2952a8",
   "_rev": "6-e196bfb6aca85492e4f96f3af6fd1ee2",
   "type": "employee",
   "employee": {
       "employeeId": "1",
       "employeeName": "Test"
   }
 }

CouchDB 中,我创建了自己的设计过滤器:

{
   "_id": "_design/employee",
   "_rev": "35-00f59706402452291d30c3fb6e9a5356",
   "filters": {
       "byEmployeeId": "function(doc, req) {
                            if(doc.type != 'employee') {
                                return false;
                            } 

                             if(doc.employee.employeeId == req.query.employeeId) {
                                return true;
                            } else {
                                return false;
                            }
                        }"
   }
}

另一方面,我使用 Couchbase Lite 作为我的 Android 移动项目来复制拉取员工数据:

Replication pull = this.getCouchbaseUtility().getDatabase().createPullReplication(
                    new URL("http://localhost:5984/testdb")
            );

            pull.setAuthenticator(authenticator);
            pull.setContinuous(false);

            pull.setFilter("employee/byEmployeeId");

            Map<String, Object> params = new HashMap<>();
            params.put("employeeId", "1");

            pull.setFilterParams(params);

            pull.addChangeListener(new Replication.ChangeListener() {
                @Override
                public void changed(Replication.ChangeEvent event) {
                    System.out.println(event.getStatus());
                }
            });

            pull.stop();
            pull.start();

应用程序运行没有错误,但它没有成功地将数据复制到移动 Couchbase 存储中。

如果我将设计过滤器更改为始终返回 true,则 App 可以从 CouchDB 复制员工文档。会不会是 req.query.employeeIdCouchbaseCouchDB 不兼容?

我可以知道我做错了什么吗?

【问题讨论】:

标签: android couchdb couchbase database-replication couchbase-lite


【解决方案1】:

不幸的是,当后端是 Couchbase 服务器时,Couchbase lite 仅允许过滤拉取复制。

当后端是 CouchDB、Cloudant 或其他任何东西时,您无法执行过滤复制。

从 CouchDB、PouchDB 或 Cloudant 过滤拉取 从 Couchbase Lite 1.2 开始,使用非 Couchbase 数据库的拉取复制中的过滤器功能不再可用。在 POST /{db}/_changes 请求中处理过滤器参数的方式不兼容(参见 #1139)。

From Couchbase Lite docs

【讨论】:

    【解决方案2】:

    在查询字符串中使用过滤器参数不是正确的实现方式,因为查询字符串有其自身的局限性。相反,如果您使用的是 CouchDB Server 2.0 及更高版本,则应该使用选择器而不是过滤器。您只需要在客户端确保设置过滤器名称 = _selector 并在过滤器参数中以以下格式传递参数 -

    {
      "selector": {
        "key_name_to_filter": "key_value_to_filter",
        "$or": [
          {
            "$and": [
              {
                "key_1": "value_1"
              },
              {
                "key_2": "value2"
              }
            ]
          },
          {
            "$and": [
              {
                "key_3": "value_3"
              },
              {
                "key_4": "value_4"
              }
            ]
          }
        ]
      }
    }
    

    以上格式只是一个示例,说明您可以在选择器过滤器中创建复杂的查询。

    【讨论】:

      【解决方案3】:

      Couchbase-lite 过滤器不适用于除 Couchbase 之外的任何其他服务器。原因是在 CouchDb 中,_changes REST 调用是 GET 请求,而从 1.2 版开始,Couchbase-lite 已将请求转换为 发布

      一种方法是分叉存储库并在 ChangeTracker.java 中进行更改并将 usePOST 布尔变量更改为 false,您将看到它开始工作。

      但这是 Couchbase 选择的路径,并且从 2.0 版开始,对所有非 Couchbase 后端的支持将完全被删除,因为它们将完全远离 http

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-10
        • 1970-01-01
        • 2013-12-27
        • 2017-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多