2011-06-20 69 views
11

我有一個問題,我喜歡「自動」刪除我的沙發上的文檔,這些文檔至少要6個月大。 我的CouchDb實例在Linux服務器上運行,有沒有什麼辦法可以實現這個很簡單(就像編寫一個簡單的2行shell腳本一樣)?CouchDb:如何刪除大於6個月的文檔?

+0

我更新了我的文章。我希望它能對你有所幫助 –

+5

V-Light是正確的,如果沒有(1)所有文檔中的時間戳,以及(2)準備按時間戳搜索的查詢,您都無法做到這一點。但是,一旦/如果你有這個問題,我就用'jss'來做一次性散裝沙發工作。基本上:'curl --silent $ some_query | jss - '{_id:$ ._ id,_rev:$ ._ rev,_deleted:true}'--bulk-docs | curl --silent $ some_db/_bulk_dos' – JasonSmith

+3

由於使用google很難找到,下面是鏈接到jss:https://github.com/iriscouch/jss –

回答

7

你可以寫在CouchDB中的更新功能刪除某些條件的文檔(可以使用PARAMS同時調用函數): http://wiki.apache.org/couchdb/Document_Update_Handlers#Creating_an_Update_Handler

(看「就地」並想象設置「_delete:true」)。

"deletefunc": 
... 
if(doc.created_at<req.query.mindate) { 
    doc._deleted:true; 
    return [doc, "deleted"] 
} 

,並呼籲 ...... DB/_design/updatefuncdesigndoc/_Update/deletefunc/dok_id_x MINDATE = 20110816

唯一的工作是:?調用明確數據庫的每個文檔使用此功能(先調用_all_docs或_changes)

+0

謝謝。更新函數是我一直在尋找的。 –

5

只要我知道,CouchDB將每個數據庫(包含所有文檔)存儲在單個文件()中。因此,您將無法通過名稱或添加日期時間查找特定的文檔。

UPDATE:

我認爲唯一的辦法是一個 「_doc_created」(或 「_doc_established」)字段添加到每個文件,用時間戳(相似SQLS NOW())。然後創建一個僅顯示文件ID和「_doc_created」字段值的視圖:

e.G.

function(doc) { 
    emit(doc._doc_created, doc._id); 
    //or just emit(doc._doc_created) 'couse views alsways return docIDs 
} 

,然後寫一個腳本(如shell腳本),這得到所有這些ID和日期(通過捲曲),過濾,然後(再次通過捲曲)刪除所有文檔從數據庫,_doc_crated日期時間是超過6從現在起一個月

+2

+1。與大多數文件系統和RoR等系統不同,CouchDB不要求或建議您在數據中保留時間戳。這是不幸的,因爲成功的應用程序(即那些「活」幾個月或幾年)的應用程序幾乎總是需要稍後的信息。像種植一棵樹,現在是清理數據的下一個最佳時間。由於CouchDB非常寬鬆,您可以根據需要爲記錄添加時間戳,並根據需要查詢和刪除它們。 – JasonSmith

+2

儘管添加時間戳的方法很好,但運行'清除腳本'的建議方法是一個非常複雜的方法。請參閱「couchdb中的更新函數」,瞭解更簡單的方法並利用相應的couchdb功能。 – Jay