2012-10-24 12 views
12

sposobu rozwiązywania replikacji konflikty zalecanych przez oficjalnej dokumentacji jest:Rozwiązywanie konfliktów replikacji dla usuniętych dokumentów w CouchDB

  1. Czytaj sprzeczne wersje używając _conflicts pola dokumentu (na przykład za pomocą widoku)
  2. Fetch docs dla wszystkich korekt wymieniony
  3. wykonać specyficzne dla aplikacji łączących
  4. Usuń niechciane korekty

Problem pojawia się, gdy chcę scalić dokumenty usunięte. Nie pojawiają się w polu _conflicts, ale w _deleted_conflicts. Jeśli scalę tylko przy użyciu pola _conflicts, a dokument zostanie usunięty z lokalnej bazy danych i edytowany w zdalnej replice, zostanie on wskrzeszony lokalnie podczas replikacji. Mój model aplikacji zakłada, że ​​usunięcie zawsze ma pierwszeństwo przy scalaniu: usunięte dokumenty pozostają usunięte niezależnie od tego, z czym edycje są w konflikcie.

Na pierwszy rzut oka najprościej jest sprawdzić, czy _deleted_conflicts nie jest pusta, a jeśli nie jest pusta, skasować dokument, prawda? No cóż ... problem polega na tym, że może to również zawierać usunięte poprawki, które zostały wprowadzone przez rozwiązywanie konfliktów edycji w kroku 4, więc znaczenie _deleted_conflicts jest w tym przypadku niejednoznaczne.

Jaki jest kanoniczny sposób rozwiązywania konfliktów usuwania w CouchDB (jeśli istnieje), który nie wymaga robienia dużych rzeczy, takich jak oznaczanie dokumentów jako usunięte i filtrowanie w warstwie aplikacji?

Odpowiedz

5

Najlepszym rozwiązaniem byłoby użycie zastrzeżonej właściwości _deleted do usuwania dokumentów zamiast HTTP DELETE. Wtedy jesteś wolny, aby również ustawić inne właściwości:

doc._deleted = true; 
doc.deletedByUser = true; 
doc.save(); 

następnie w procesie scalania wyboru _changes RSS dla _deleted_conflicts i usunąć dokument, jeśli istnieje wersja ciągu _deleted_conflicts który ma flagę deletedByUser ustawiony true.

Mam nadzieję, że to pomoże!

Powiązane problemy