2012-10-24 5 views
12

La façon de résoudre les conflits de réplication recommandés par la documentation officielle est:Résoudre les conflits de réplication des documents supprimés dans CouchDB

  1. Lire les révisions en conflit en utilisant le terrain _conflicts de document (par exemple via une vue)
  2. Fetch docs pour toutes les révisions
  3. inscrite comme Perform fusion spécifique à l'application
  4. supprimer les révisions indésirables

Le problème se produit lorsque je souhaite fusionner supprimé documents. Ils n'apparaissent pas dans le champ _conflicts, mais dans _deleted_conflicts. Si je fusionne uniquement à l'aide du champ _conflicts et qu'un document est supprimé dans la base de données locale et modifié dans la réplique à distance, il sera ressuscité localement lors de la réplication. Mon modèle d'application suppose que la suppression est toujours prioritaire lors de la fusion: un document supprimé reste supprimé quel que soit le type de modification avec lequel il est en conflit. Donc, à première vue, la chose la plus simple à faire est de vérifier que _deleted_conflicts n'est pas vide et s'il n'est pas vide, supprimez le document, n'est-ce pas? Eh bien ... le problème avec ceci est que cela peut aussi contenir des révisions supprimées qui ont été introduites en résolvant les conflits d'édition à l'étape # 4, donc la signification de _deleted_conflicts est ambiguë dans ce cas. Quelle est la manière canonique de traiter les conflits de suppression dans CouchDB (le cas échéant) qui n'implique pas de faire des choses grossières comme marquer des documents comme étant supprimés et filtrer sur la couche d'application?

Répondre

5

La meilleure solution consisterait à utiliser la propriété réservée _deleted pour supprimer des documents au lieu de HTTP DELETE. Ensuite, vous êtes libre aussi définir d'autres propriétés:

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

Ensuite, dans le processus de fusion vérifier les _changes se nourrissent pour _deleted_conflicts et supprimer le document s'il y a une révision au sein _deleted_conflicts qui a le drapeau deletedByUser mis à true.

J'espère que cela aide!

Questions connexes