3 Stimmen

CouchDB "_changes" Listener aktualisiert das Dokument, was eine weitere Änderung auslöst

Ich möchte ein Hintergrundprogramm schreiben, das den _changes-Feed einer CouchDB überwacht und möglicherweise das Dokument aktualisiert. Das Problem ist, dass die Aktualisierung eine weitere _Änderung verursacht und ich eine Endlosschleife bekomme! Wie kann ich das am besten vermeiden?

Zum Beispiel folgendes Szenario: Ich habe eine CouchApp, in der Benutzer Dokumente über ihren Browser bearbeiten. Ich habe auch ein Python-Programm, das eine PDF-Version eines Dokuments erstellt und diese dann als Anhang an das Dokument selbst anhängt. Mein Problem ist, dass das PUT Attachment zum Hochladen des PDFs auch eine Änderung des Dokuments auslöst. Ich muss in der Lage sein zu erkennen, ob eine Änderung durch den PDF-Upload verursacht wird oder nicht. Das sollte eigentlich ganz einfach sein, aber mir fällt keine einfache Lösung ein. Ich möchte lieber, dass das PDF-Generatorprogramm "zustandslos" ist und alle erforderlichen Zustände in der Datenbank selbst behält.

Dies lässt sich leicht bewerkstelligen, wenn ich verlange, dass Benutzer, die das Dokument ändern, eine Art Kennzeichen auf dem Dokument setzen, um anzuzeigen, dass es bearbeitet werden muss. Die Frage ist nur, wie man das machen kann, ohne dass das erforderlich ist.


Ich bin zu dem Schluss gekommen, dass ein "_changes"-Listener niemals das Dokument ändern sollte, auf das er hört. In meinem Fall habe ich beschlossen, meine PDF-Datei an ein separates Dokument in einer separaten "Datenbank" innerhalb von couchdb anzuhängen, aber dieselbe "_id" zu verwenden, um die Zuordnung zu erleichtern. Auf diese Weise löse ich keine "_change" bei denselben Dokumenten aus, die ich gerade abhöre. Ich kam nicht umhin, von jedem Client, der das Dokument ändert, zu verlangen, dass er es irgendwie als bearbeitungsbedürftig "kennzeichnet" (indem er den bestehenden Anhang löscht oder auf andere Weise ein "schmutziges" Kennzeichen setzt). Nach reiflicher Überlegung bin ich zu dem Schluss gekommen, dass man ein Dokument nicht ändern darf, wenn man eine "_change"-Benachrichtigung für dieses Dokument erhält. Ist noch jemand zu demselben Schluss gekommen?

5voto

b_erb Punkte 20272

Verwenden Sie eine Filterfunktion und die zweite Änderung herausfiltern - entweder durch die Änderung der Dokumentstruktur oder durch das Setzen eines zusätzlichen Kennzeichens für das geänderte Dokument:

function(doc, req)
{
  if(!doc.hasStructuralChange) { //fix this
    return true;
  }
  return false;
}

o

function(doc, req)
{
  if(!doc.changed) { //set doc.changed during first update
    return true;
  }
  return false;
}

Bearbeiten: Sie können auf einen Anhang prüfen über if (doc._attachments)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X