2011-08-20 2 views
2

Je veux écrire un programme d'arrière-plan qui surveillera le flux _changes d'un CouchDB, et éventuellement mettre à jour le document. Le problème est que la mise à jour provoque un autre changement, et je reçois une boucle sans fin! Quelle est la meilleure façon d'éviter cela? Par exemple, voici le scénario spécifique: J'ai un CouchApp où les utilisateurs modifient des documents via leur navigateur. J'ai également un programme python qui crée une version PDF d'un document, puis l'attache en tant que fichier joint au document lui-même. Mon problème est que faire la pièce jointe PUT pour télécharger le PDF déclenche également un changement de document. Je dois être en mesure de dire si un changement est causé par le téléchargement PDF, ou non. Il semble que cela devrait être facile, mais je ne peux pas imaginer un moyen simple de le faire. Je préférerais que le programme générateur de PDF soit "sans état", en conservant tout état requis dans la base de données elle-même.CouchDB "_changes" écouteur met à jour le document, ce qui déclenche une autre modification

Maintenant, cela peut être facilement fait si je demande aux utilisateurs qui changent le document de définir une sorte d'indicateur sur le document pour indiquer qu'il doit être traité. L'astuce est de savoir comment le faire sans l'exiger. Je suis arrivé à la conclusion qu'un écouteur "_changes" ne devrait jamais modifier le document qu'il écoute. Dans mon cas, j'ai décidé d'attacher mon fichier PDF à un document séparé, dans une "base de données" séparée dans couchdb, mais en utilisant le même "_id" pour le rendre facile à corréler. De cette façon, je ne déclenche pas un "changement" sur les mêmes documents que j'écoute. Je ne pourrais pas me passer de la nécessité d'exiger que chaque client qui modifie le document le signale comme nécessitant un traitement (en supprimant la pièce jointe existante ou en plaçant un drapeau "sale"). Après beaucoup de réflexion, je pense que ce sera une règle générale pour moi: que vous ne devez pas modifier un document à la réception d'une notification "_change" pour ce document. Quelqu'un d'autre est-il arrivé à la même conclusion?

Répondre

4

Utilisez un filter function et et filtrer le deuxième changement - soit par la structure du document changement ou en définissant un indicateur supplémentaire du document modifié:

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

ou

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

Edit: Vous peut vérifier une pièce jointe via if (doc._attachments)

+0

Merci, c'était rapide (vous avez répondu avant d'ajouter le paragraphe "scénario spécifique"). Comment pouvez-vous vérifier si un document a un changement de structure? Pouvez-vous le comparer à sa version précédente? –

+1

Il n'existe aucune garantie que la révision précédente est disponible, vous devez donc vous assurer que vous pouvez détecter si un document doit être traité en utilisant le document lui-même. Dans votre cas, vous pouvez tester le talon PDF dans doc._attachments. Si présent, ne faites rien. Si manquant, ajoutez-le. –

+0

Dans la fonction de document de filtrage, vous obtenez uniquement la révision en cours (la révision "après modification"), mais vous pouvez définir un tel indicateur côté client ou utiliser un gestionnaire de mise à jour et le définir automatiquement. –

Questions connexes