Возможно ли удалить документы во временном представлении Apache CouchDB?

#couchdb

#couchdb

Вопрос:

Все документы в моей базе данных имеют временную метку:

Пример документа:

 {
    ...
    "timestamp": 1404587326,
    ...
}
  

С помощью map reduce я могу фильтровать все документы старше определенной даты, например старше вчерашнего дня, но как я могу удалить эти документы старше вчерашнего дня?

 function(doc) {
    var yesterday = Date.now() - (60*60*24);
    if(doc.timestamp < yesterday) {
        delete(doc._id); // how??
    }
}
  

Ответ №1:

Прежде всего, ваш код сокращения карты не работает!

Ваша функция map вызывается только при изменении документа. Таким образом, Date.now() функция будет представлять собой дату, когда функция map была вызвана в первый раз после изменения документа, а не фактическое время доступа к индексу, который создается функцией.

Также я не знал, что вы можете удалить документ в представлении.

Вот как вы могли бы этого добиться

Используйте дату в качестве идентификатора в вашей функции map и возвращайте идентификатор документов. Затем используйте свое клиентское приложение для вызова представления с startkey параметром, который вы можете установить равным Date.now() - 24*60*60 .

Затем представление вернет только документы, которые являются более свежими, чем startkey , но пока не удалит ни одного документа.

Ваша функция map будет выглядеть примерно так:

 function(doc){
  emit(doc.timestamp, doc);
}
  

Вам действительно нужно удалять документы?

Если вы действительно хотите, чтобы документы старше 2 дней были удалены, возможно, у вас не самая лучшая база данных, использующая couchdb. Couchbase — который в некотором роде похож на couchdb, и MongoDB, насколько я знаю, предлагают варианты истечения срока действия документа.

В качестве альтернативы вы могли бы время от времени получать доступ к документам с помощью вышеупомянутой функции map. Но используйте клавишу endkey, чтобы получить все старые документы. Затем вам нужно будет удалить их по отдельности.

Наконец, временные представления

Я не уверен, почему вы хотите использовать один из них, просто сохраните свое представление.

Комментарии:

1. Интересный и ясный ответ, спасибо. На самом деле мне не нужно часто удалять документы, мне, вероятно, понадобится это один или два раза в год, чтобы удалять старые документы (наверняка старше одного дня).

2. лучше этого не делать emit(..., doc) — это встраивает полную копию документа в представление, которое в большинстве случаев не требуется для выполнения запроса, и вдобавок дублирует то, что уже доступно в самой базе данных. Здесь было бы достаточно простого emit(doc.timestamp) .

Ответ №2:

Вы можете использовать подход к просмотру, указанный @dashservice, а затем выполнить HTTP-УДАЛЕНИЕ / db / docname или использовать конечную точку _bulk_docs API, если у вас их много.

Распространенный шаблон проектирования couchdb заключается в хранении документов в отдельных базах данных, которые впоследствии могут быть удалены, когда эти документы не требуются.