0

我没有设法从CouchDB中提取复制数据。Couchbase Lite从CouchDB中过滤复制

我正在使用CouchDB用于我的文档存储。

CouchDB的版本:的Apache CouchDB的1.6.1
Couchbase精简版:Couchbase精简版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精简版为我的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,则应用程序可以从CouchDB复制员工文档。难道是req.query.employeeId不兼容CouchbaseCouchDB

我可以知道我做错了吗?

+0

可能的重复:https://stackoverflow.com/questions/47220517/android-couchbase-lite-pull-with-filter-replication-setfilter –

回答

1

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

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

过滤拉由于Couchbase精简版1.2,与非Couchbase数据库拉复制过滤器功能不再可用。在POST/{db}/_ changes请求中处理filter参数的方式存在不兼容性(请参阅#1139)。

From Couchbase Lite docs

0

Couchbase,精简版的过滤器不会从Couchbase除了任何其他服务器工作。同样的原因是,在CouchDb中,REST调用是GET请求,而从1.2版本开始,Couchbase-lite已将请求转换为POST


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

但是,这是Couchbase从第2版中选择并前进的路径。0,对所有非Couchbase后端的支持将被完全删除,因为它们将完全从http移开。