Couchdb — можно ли удалить реплицированный документ

Я разрабатываю систему, которая будет использовать CouchDB и TouchDB\CloudantSync для кэширования базы данных на смартфонах пользователей с помощью репликации. Теперь допустим, у меня есть 1000 документов, каждый из которых имеет вложение размером 100 КБ, и я хочу освободить место на смартфоне, удалив документ.

Я хочу, чтобы после того, как я удалю какой-то документ, я мог снова реплицировать его с сервера. Это отличается от удаления, которое дает документу новую версию и предотвращает его повторную репликацию с сервера (поскольку удаленный документ на смартфоне является дочерним по отношению к неудаленному).

Очевидно, я мог бы делать избыточные обновления в документах сервера, но это неэффективно...

Есть ли способ «рассинхронизировать» документ?


person Oren    schedule 10.06.2014    source источник


Ответы (3)


Вы можете создать базу данных для каждого пользователя локально, с которой смартфон пользователя настроен на непрерывную репликацию. Затем, чтобы отправить документ пользователю, реплицируйте его из основной базы данных в локальную пользовательскую базу данных, чтобы репликация забрала ее. Чтобы удалить его удаленно, удалите его только в базе данных локального пользователя, распространив удаление. Чтобы повторно скопировать его на устройство, вы должны вручную перезаписать удаленный документ его оригиналом из основной базы данных.

person skiqh    schedule 11.06.2014
comment
Перекопировать не получится. Удаленный документ в базе данных пользователя является дочерним по отношению к исходному документу, поэтому репликация из главной базы данных в пользовательскую базу данных не будет повторно копировать исходный документ. - person Oren; 11.06.2014
comment
@Орен Ты абсолютно прав. Отредактировал мой ответ, чтобы отразить это. - person skiqh; 12.06.2014

  1. Создайте непрерывную/опросную репликацию с сервера на смартфон с фильтрацией, чтобы предотвратить чрезмерное использование пространства на смартфоне.
  2. Всякий раз, когда вы хотите освободить место, удалите идентификатор документа из последней отфильтрованной репликации, удалите его со смартфона (используйте сжатие для настоящей очистки) и сохраните его идентификатор в каком-либо списке unsynced_documents.
  3. Всякий раз, когда вы хотите повторно синхронизировать документ, прочитайте его с сервера и создайте на смартфоне как совершенно новый документ (игнорируйте редакцию). Вы можете добавить поле resynced: true в файл json документа. Не забудьте обновить фильтр репликации и список unsycned_documents.
  4. При изменении «пересинхронизированного» документа на сервере он будет реплицирован на смартфон, на котором уже есть документ с таким же идентификатором (созданный на смартфоне). Это создаст конфликт. Разрешите конфликт, выбрав ревизию сервера (удалив ревизию с помощью resynced: true).

Я говорю о случае, когда требуется односторонняя (Сервер -> Пользователь) репликация. т. е. пользователи имеют только права на чтение. Если вы даете пользователям разрешение на запись, вы должны найти способ отличить преднамеренное удаление документа от «отключения синхронизации».

person Oren    schedule 11.06.2014

Проверьте эту ошибку в TouchDB. Похоже, функция очистки — это то, что вам нужно.

Однако это может повлиять на повторную репликацию, как указано в ошибке. Я не уверен, поддерживает ли TouchDB репликацию именованных документов, я думаю, что именно так вы могли бы обойти стандартное поведение репликации.

К сожалению, мы еще не представили очистку в Cloudant Sync (это в дорожной карте).

person Mike Rhodes    schedule 10.06.2014
comment
Источник: wiki.apache.org/couchdb/Purge_Documents Если вы используете _purge для освобождения места, вы почти наверняка используете CouchDB не по назначению. Наиболее распространенная причина, по которой разработчики используют _purge ненадлежащим образом, — это управление недолговечными данными (записями журнала, очередями сообщений и т. д.). Лучшее средство — периодически переключаться на новую базу данных и удалять старую (после того, как срок действия всех записей в ней истечет). - person Oren; 10.06.2014
comment
Кажется, у них также есть проблемы с повторной репликацией очищенных документов, потому что репликатор просматривает только новые ревизии, созданные в исходной базе данных с момента последней успешной репликации... - person Oren; 10.06.2014
comment
Разработчик CouchDB здесь. Purge не предназначен для обычных операций. Это крайняя мера на тот случай, если вы передали свой SSN или номер кредитной карты в CouchDB и вам нужно его получить. - person Jan Lehnardt; 11.06.2014
comment
Хотя я свободно признаю, что это не предназначено для использования по назначению, в сочетании с репликацией именованных документов я думаю, что это может соответствовать варианту использования. Однако, если это будет очень проблематично, я хотел бы понять, почему. - person Mike Rhodes; 23.06.2014