Как копировать документы из одной базы данных в другую базу данных и удалять документы в исходной базе данных после завершения репликации - PullRequest
4 голосов
/ 20 октября 2019

Проблема

У меня есть база данных записей recordingsDB, отправленных из клиентского приложения, которое использует pouchDB. Каждая запись - это собственный документ. например,

{
  "_id": "2019-10-20T04:51:22.744Z",
  "_rev": "1-53e73be51ea76f96e3cfde2de1502439",
  "locale": "en",
  "_attachments": {
    "recordings.webm": {
      "content_type": "audio/webm; codecs=opus",
    ...
    }
  }
}

Клиентское приложение имеет одного пользователя clientUser (так что любой, кто получает доступ к сайту, становится clientUser). Пользователь клиента может поэтому писать в recordingsDB, но также читать из recordingsDB, что нежелательно, потому что они могут читать любые записи из recordingsDB.

Я пошел по пути «только для записи» базы данных и наткнулся на этот ответ от 2011 года. Мне интересно, как это реализовать.

Идея

Итак, я считаю, что сработало бы, если бы мой recordingsDB повторил бы все записи в masterRecordingsDB, где clientUser больше не является участником. После копирования каждого документа из recordingsDB в masterRecordingsDB он будет удален.

Настройка

Я настроил репликатор, который копирует содержимое из записи DB в masterRecordingsDB.

{
  "_id": "recordings_to_master_recordings",
  "_rev": "3-a6fa84dd89c2ec037353c17f65b4c765",
  "continuous": true,
  "source": {
    "url": "http://localhost:5984/recordings",
    "headers": {
      "Authorization": "Basic YWRtaW46cGFzc3dvcmQ="
    }
  },
  "target": {
    "url": "http://localhost:5984/master_recordings",
    "headers": {
      "Authorization": "Basic YWRtaW46cGFzc3dvcmQ="
    }
  },
  "user_ctx": {
    "name": "admin",
    "roles": [
      "_admin"
    ]
  },
  "owner": "admin"
}

Как удалить элементы в записи DB после каждой успешной репликации?

1 Ответ

0 голосов
/ 23 октября 2019

Существует два способа решения вашей проблемы.

Как правило, в CouchDB удаление документа немного ошибочно. Когда документ удаляется из-за природы CouchDB только для добавления, создается новая редакция данного документа, состоящая исключительно из его идентификатора, редакции и поля _deleted, которое имеет значение true. Эта «надгробная плита», как она называется, позволяет реплицировать удаление по всем базам данных. Тем не менее, надгробная плита остается в базе данных и занимает (хотя и очень мало) место. Вы можете реализовать это самостоятельно и просто создать ревизию документа, которая выглядит примерно так: {"_id": "0", "_rev": "1-62657917", "_deleted": true}. Важно отметить, что документы с удаленным флагом больше не будут возвращаться в запросах.

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

Дополнительная информация:

Документы CouchDB при удалении

Документы CouchDB по чистке

И, наконец, полезная статья об удалении в CouchDB

...