CouchDB / PouchDB选择器无法正确同步

时间:2018-09-26 05:58:02

标签: couchdb pouchdb

我已经设置了一个选择器,我的pouchDB根据该选择器同步了文档。

这里是选择器。它将获取所有类型为“作业”的文档,其中包括许可数组中的1371 ID或任何类型为“负载”的文档。

const myselector = {

$or: [
        {
          type: {
            $eq: 'job'
          },
          permission: {
            $elemMatch: { $eq: 1371 }
          }
        },

        {
          type: {
            $eq: '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函数。

1 个答案:

答案 0 :(得分:1)

您描述的行为是正确的。

过滤后的变更供稿仅包含当前符合选择器条件的文档。筛选不考虑文档的先前状态。

这个问题暴露了一个类似的问题:CouchDB filter function and continuous feed

我看到了两种管理方法:

  • 使过滤数据成为文档身份的一部分: 通过将过滤属性作为文档ID的一部分来设计文档,因此应将任何过滤属性的更改作为删除和创建新文档的方式进行管理。本地数据库将仅包含有效文档。

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