Селекторы CouchDB / PouchDB не синхронизируются должным образом - PullRequest
0 голосов
/ 26 сентября 2018

Я установил селектор, и моя pouchDB синхронизирует документы на основе этого селектора.

Вот селектор.Он получит все документы типа = "job", которые содержат 1371 идентификатор в массиве разрешений ИЛИ любой документ типа = "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);
  });

Это прекрасно работает и сообщает мне, есть ли изменения в каком-либо документе, но если, например, я внес изменения в массив разрешений и идентификатор 1371 изменился, он не уведомляет меня об этом изменении.Теперь, если я изменю любое другое поле в этом документе, оно не будет реплицировано, поскольку оно больше не синхронизировано.

Я использую Selector вместо фильтров CouchDB, поскольку они, по-видимому, в 10 раз быстрее, но эта синхронизация становится проблемой.

Если документ изменился и больше не попадает в критерии выбора, то функция change не вызывается.

1 Ответ

0 голосов
/ 26 сентября 2018

Поведение, которое вы описали, является правильным.

Отфильтрованный канал изменений содержит только те документы, которые в настоящее время соответствуют условиям селектора.Фильтрация не учитывает предыдущее состояние документа.

В этом вопросе обнаружена похожая проблема: Функция фильтра CouchDB и непрерывная подача

Я вижу 2 подхода к решению этой проблемы:

  • Сделать данные фильтрации частью идентификатора документа : Создайте свои документы, включив атрибуты фильтрации как часть идентификаторов документа, поэтому изменение любого из атрибутов фильтрации должно управляться как удаление и созданиеновый документ.Локальная база данных будет содержать только действительные документы.

  • Хранить историю фильтрации данных в документе : Вы должны сохранить историю значений атрибутов фильтрации в документах и ​​развернуть свой селектор, чтобы проверитьтекущие и старые значения.В этом случае ваше клиентское приложение отвечает за определение того, какие из документов в локальной базе данных являются действительными в данный момент, поскольку не каждый документ в локальной базе данных является действительным для клиента.

...