2015-12-24 4 views
2

У нас есть продукт, который использует центральные базы данных CouchDB для каждого клиента, реплицирующегося в приложения, запущенные на iPad пользователя. Большая часть базы данных могут реплицировать нормально, но у нас есть две категорий документа, которые мы хотим фильтровать:Удаление документов из реплик CouchDB

  1. Документов с владельцем - мы хотим, чтобы отфильтровать репликацию только текущие документы пользователей (и документы без указания владельца).
  2. Последние X документов определенного типа. Для некоторых видов документов мы хотим оставить только последние 10 (скажем) копий на iPad.

Мы можем установить оба правила достаточно легко, используя фильтрованную репликацию - чтобы сервер представлял только подмножество документов, которые мы хотим для iPad для репликации. Кроме ... это не работает.

  1. Если у документа нет владельца (реплицировано), а позже указан владелец, он исчезает из потока репликации, но не из iPad. На самом деле версия документа, которая остается на iPad, по-прежнему не имеет владельца и поэтому мы не можем даже спрятать его в коде.
  2. Когда документ становится 11-м самым старым и исчезает из потока репликации, он не исчезает с iPad. Действительно, если база данных iPad не будет восстановлена, все версии этих документов попадут туда и больше не будут реплицироваться, что хуже, чем просто повторить их все в первую очередь.

Мы обнаружили хакерское обходное решение - в случае, когда документ получает нового владельца ИЛИ становится старше X, мы дублируем его и удаляем оригинал. Удаление ссылок на iPad и новый документ отфильтровывается из репликации. Это работало достаточно хорошо (хотя это немного неэффективно). Однако затем мы поняли, что недавно скопированный документ потерял всю информацию о его пересмотре, и мы полагались на изменения для отслеживания изменений!

Итак, есть ли у кого-нибудь другое предложение? То, что мы ищем, - это механизм вытягивания документа из реплик iPad по требованию. Я знаю, что мы можем поручить iPad удалять документы локально - но рано или поздно эти удаления будут утечки на сервер и уничтожить оригинал?

ответ

2

... мы полагались на пересмотр для отслеживания изменений

ИМХО это самый интересный момент, чтобы говорить об альтернативном решении.

Извините, но я должен сказать, что вы используете средство контроля версий CouchDB так, как это не рекомендуется. Изменения в документе являются временными. Лучший способ отслеживания изменений документа - записать журнал изменений внутри или снаружи документа.

Как бы вы сохраняли изменения вне самого документа - да, вы создали бы новые документы. сюрприз: вы «Взломать» является правильным решением \ о/

Может быть, вы качаете головой и ваш не счастливы, потому что вы пытались удалить документы из IPad, чтобы сделать их невидимыми на стороне клиента. Это была отправная точка вашего «Hack», верно?

Моя рекомендация не сочетать «видимость» и «существование». Лучше было бы использовать свои ноу-хау с построением view-indexs на стороне сервера так же, как клиентская сторона с PouchDB. Пусть репликация просто обрабатывает репликацию - это достаточно сложно.Использование представлений/фильтров на стороне клиента и сервера для решения требований видимости.