2011-08-20 68 views
2

我想寫一個後臺程序,將監測的CouchDB的_changes飼料,也可能更新文檔。問題是更新導致另一個_change,並且我得到一個無限循環!避免這種情況的最好方法是什麼?CouchDB的「_changes」監聽器更新文檔,這會觸發另一變化

例如,以下是具體情況:我有一個CouchApp,用戶通過瀏覽器修改文檔。我也有一個python程序,它創建一個文檔的PDF版本,然後作爲附件附加到文檔本身。我的問題是,使用PUT附件上傳PDF也會觸發文檔更改。我必須能夠判斷是否由PDF上載引起更改。這似乎應該很容易,但我想不出一個簡單的方法來做到這一點。我寧願保持PDF生成器程序爲「無狀態」,在數據庫本身中保留任何所需的狀態。現在

,這很容易,如果我需要誰改變對文檔的文檔設置某種標誌的用戶,以表明它需要處理完成。訣竅是如何做到這一點,而不需要這樣做。


我得出結論,「_changes」監聽器不應該修改它監聽的文檔。在我的情況下,我決定將我的PDF文件附加到單獨的文檔中,在couchdb中單獨的「數據庫」中,但使用相同的「_id」使關聯變得容易。這樣我就不會在我正在聽的相同文檔上觸發「_change」。我無法避免需要每個客戶端都要求將文檔以某種方式「標誌」爲需要處理(通過刪除現有附件或者設置一些「髒」標誌)。經過深思熟慮後,我認爲這對我來說是一個經驗法則:在收到該文檔的「_change」通知後,您不得修改文檔。其他人是否也得出了相同的結論?

回答

4

使用filter function和並篩選出第二個變化 - 無論是文檔的結構變化或額外的標誌設置所​​改變的文件:

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

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

編輯:您可以通過if (doc._attachments)

+0

感謝檢查的附件,這是快(你回答之前,我添加了「特定情況」的段落)。你如何檢查文檔是否有結構改變?你能比較它以前的版本嗎? –

+1

有沒有保證,以前的版本可用,所以你必須確保如果文檔使用文檔本身需要處理,你可以檢測到。就你而言,你可以測試doc._attachments中的PDF存根。如果存在,什麼都不要做。如果缺少,請添加它。 –

+0

在過濾器文檔的功能,你只能得到當前版本(即「後改爲」修訂版),但您可以設置這樣的標誌無論是客戶端,或使用更新的處理程序,並自動設置。 –