2011-06-20 32 views
11

Tôi có vấn đề mà tôi muốn "tự động" xóa tài liệu trong chiếc ghế dài của tôi, ít nhất 6 tháng tuổi. Ví dụ CouchDb của tôi chạy trên máy chủ Linux, có cách nào để đạt được điều này khá đơn giản (như viết một kịch bản lệnh shell 2 dòng đơn giản) không?CouchDb: Cách xóa tài liệu cũ hơn 6 tháng?

+0

Tôi đã cập nhật bài đăng của mình. Tôi hy vọng nó sẽ giúp bạn –

+5

V-Light là đúng mà bạn không thể làm điều này mà không có (1) dấu thời gian trong tất cả các tài liệu của bạn, và (2) truy vấn chuẩn bị để tìm kiếm theo dấu thời gian. Tuy nhiên, một lần/nếu bạn đã có điều đó, tôi sử dụng 'jss' cho một lần làm việc với số lượng lớn Couch. Về cơ bản: 'curl --silent $ some_query | jss - '{_id: $ ._ id, _rev: $ ._ rev, _deleted: true}' - tài liệu trợ giúp | curl --silent $ some_db/_bulk_dos' – JasonSmith

+3

Vì nó rất khó tìm với google, đây là liên kết đến jss: https://github.com/iriscouch/jss –

Trả lời

7

bạn có thể viết một chức năng cập nhật trong couchdb mà xóa một doc trên các tiêu chí nhất định (bạn có thể sử dụng params trong khi gọi hàm): http://wiki.apache.org/couchdb/Document_Update_Handlers#Creating_an_Update_Handler

(xem "tại chỗ" và tưởng tượng cài đặt "_delete: true").

cái gì đó như

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

và gọi ... db/_design/updatefuncdesigndoc/_update/deletefunc/dok_id_x mindate = 20110816

Công việc duy nhất là: gọi từng tài liệu trong một cơ sở dữ liệu rõ ràng với chức năng này (gọi _all_docs hoặc _changes trước)

+0

Cảm ơn bạn. Chức năng cập nhật là những gì tôi đang tìm kiếm. –

5

Miễn là tôi biết, CouchDB lưu trữ từng cơ sở dữ liệu (với tất cả tài liệu) trong một tệp đơn (). Vì vậy, bạn sẽ không thể tìm thấy tài liệu cụ thể theo tên của nó hoặc thêm-datetime.

UPDATE:

Tôi nghĩ rằng cách duy nhất sẽ có thêm một (hoặc "_doc_established") trường "_doc_created" cho từng tài liệu, với một dấu thời gian (tương đồng để SQLs NOW()). Sau đó, tạo chế độ xem chỉ hiển thị các ID tài liệu là giá trị của các trường "_doc_created":

e.G.

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

và sau đó viết một kịch bản (ví dụ như một vỏ kịch bản) mà được tất cả các ID và số ngày (thông qua curl), lọc nó và sau đó (một lần nữa qua curl) Xóa tất cả các tài liệu từ cơ sở dữ liệu mà _doc_crated datetime là lớn hơn 6 tháng từ nay

+2

+1. Không giống như hầu hết các hệ thống tập tin, và các hệ thống như RoR, CouchDB không yêu cầu hoặc gợi ý rằng bạn giữ dấu thời gian trong dữ liệu của mình. Điều đó là không may, bởi vì các ứng dụng thành công (tức là những ứng dụng "tháng" sống hoặc hàng năm) hầu như luôn luôn cần thông tin đó sau đó. Giống như trồng một cây, thời gian tốt nhất tiếp theo để làm sạch dữ liệu là bây giờ. Kể từ khi CouchDB được thoải mái, bạn có thể thêm dấu thời gian vào hồ sơ của bạn khi cần thiết và truy vấn và xóa chúng khi cần thiết. – JasonSmith

+2

Trong khi cách tiếp cận thêm dấu thời gian là tốt, cách tiếp cận được đề xuất để chạy 'kịch bản thanh lọc' là một cách tiếp cận khá phức tạp. Xem 'chức năng cập nhật trong couchdb' cho một cách tiếp cận đơn giản hơn và tận dụng các tính năng couchdb thích hợp. – Jay

Các vấn đề liên quan