#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 заключается в хранении документов в отдельных базах данных, которые впоследствии могут быть удалены, когда эти документы не требуются.