2012-10-24 16 views
12

Il modo di risolvere i conflitti di replica raccomandate da documentazione ufficiale è:Risoluzione dei conflitti di replica per i documenti eliminati in CouchDB

  1. Leggi revisioni contrastanti utilizzando il campo del documento _conflicts (ad esempio tramite una vista)
  2. Fetch documentazione per tutte le revisioni elencati
  3. Eseguire applicazioni specifiche fusione
  4. rimuovere le revisioni indesiderati

Il problema si verifica quando desidero unire documenti eliminati. Non vengono visualizzati nel campo _conflicts, ma in _deleted_conflicts. Se mi unisco solo utilizzando il campo _conflicts e un documento viene eliminato nel database locale e modificato nella replica remota, verrà resuscitato localmente sulla replica. Il mio modello di applicazione presuppone che l'eliminazione abbia sempre la precedenza quando si uniscono: un documento cancellato rimane cancellato indipendentemente da quale modifica è in conflitto con.

Quindi, a prima vista, la cosa più semplice da fare è verificare che _deleted_conflicts non sia vuoto e, se non è vuoto, eliminare il documento, giusto? Bene ... il problema con questo è che questo può contenere anche revisioni eliminate che sono state introdotte risolvendo i conflitti di modifica nel passaggio 4, quindi il significato di _deleted_conflicts è ambiguo in questo caso.

Qual è il modo canonico di gestire i conflitti di eliminazione in CouchDB (se ce n'è uno) che non implichi operazioni grossolane come la marcatura di documenti come eliminati e il filtraggio a livello di applicazione?

risposta

5

La soluzione migliore sarebbe utilizzare la proprietà riservata _deleted per rimuovere i documenti anziché HTTP DELETE. Allora siete liberi di impostare anche altre proprietà:

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

Poi, nel processo di unione di controllo _changes Feed _deleted_conflicts ed eliminare il documento se non v'è una revisione entro _deleted_conflicts che ha la bandiera deletedByUser impostato true.

Spero che questo aiuti!

Problemi correlati