【问题标题】:CouchDB/PouchDB Selectors not syncing properlyCouchDB/PouchDB 选择器未正确同步
【发布时间】:2018-09-26 05:58:01
【问题描述】:

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

这里是选择器。它将获取所有 type="job" 的文档,并且在权限数组中包含 1371 ID 或任何 type="load" 的文档。

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 发生了更改,那么它不会通知我更改。现在,如果我更改该文档中的任何其他字段,它不会被复制,因为它不再被同步。

我正在使用 Selector 而不是 CouchDB 过滤器,因为它们显然快 10 倍,但这种同步成为一个问题。

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

【问题讨论】:

    标签: couchdb pouchdb


    【解决方案1】:

    您描述的行为是正确的。

    过滤后的更改提要仅包含当前符合选择器条件的文档。过滤不考虑文档的先前状态。

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

    我看到了两种管理方法:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 2016-11-26
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多