CouchDB/PockDB选择器未正确同步

CouchDB/PockDB选择器未正确同步,couchdb,pouchdb,Couchdb,Pouchdb,我已经设置了一个选择器,我的数据库将基于该选择器同步文档 这是选择器。它将获取所有类型为“job”的文档,包括权限数组中的1371 ID或任何类型为“load”的文档 我是这样同步的 this.db.replicate .from(this.remoteDB, { selector: myselector }) .on('complete', info => { // then two-way, continuous, retriable sync th

我已经设置了一个选择器,我的数据库将基于该选择器同步文档

这是选择器。它将获取所有类型为“job”的文档,包括权限数组中的1371 ID或任何类型为“load”的文档

我是这样同步的

this.db.replicate
  .from(this.remoteDB, {
    selector: myselector
  })
  .on('complete', info => {
    // then two-way, continuous, retriable sync
    this.db
      .sync(this.remoteDB, {
        live: true,
        retry: true,
        selector: myselector
      })
      .on('change', change => {
        console.log('my change0', change);
      })
      .on('error', error => {
        console.log('my error', error);
      });
  })
  .on('error', error => {
    console.log('my error2', error);
  });
这非常有效,并告诉我任何文档中是否有更改,但如果我在权限数组中进行了更改,并且id 1371发生了更改,则它不会通知我更改。现在,如果我更改该文档中的任何其他字段,它将不会被复制,因为它不再被同步

我使用选择器而不是CouchDB过滤器,因为它们明显快10倍,但这种同步会成为一个问题


如果文档已更改且不再符合选择器标准,则不会调用
change
函数

您描述的行为是正确的

筛选的更改提要仅包括当前与选择器条件匹配的文档。筛选未考虑文档的以前状态

这个问题暴露了一个类似的问题:

我看到了两种管理方法:

  • 将筛选数据作为文档标识的一部分: 通过将筛选属性作为文档ID的一部分来设计文档,因此任何筛选属性的更改都应作为删除和创建新文档进行管理。本地数据库将只包含有效文档

  • 在文档中保留过滤数据的历史记录: 您应该在文档中保留筛选属性值的历史记录,并展开选择器以检查当前值和旧值。在这种情况下,客户端应用程序是否负责确定本地数据库中的哪些文档在某一时刻是有效的,因为并非本地数据库中的每个文档都对客户端有效

this.db.replicate
  .from(this.remoteDB, {
    selector: myselector
  })
  .on('complete', info => {
    // then two-way, continuous, retriable sync
    this.db
      .sync(this.remoteDB, {
        live: true,
        retry: true,
        selector: myselector
      })
      .on('change', change => {
        console.log('my change0', change);
      })
      .on('error', error => {
        console.log('my error', error);
      });
  })
  .on('error', error => {
    console.log('my error2', error);
  });