2014-09-19 3 views
0

Мне интересно, как лучше всего закончить только подмножество коллекции.Mongodb - expire подмножество данных в коллекции

В одной коллекции хранятся данные конверсии и данные щелчка. Данные щелчка, которые я хотел бы хранить, для недели И данные конверсии за год.

В моей коллекции "клиенты" хранить что-то вроде: { "_id": ObjectId ("53f5c0cfeXXXXXd"), "AppID": 2, "действие": "преобразование", "UID": «2_b2f5XXXXXX3ea3 "," iid ":" 2_2905040001 "," t ": ISODate (" 2014-07-18T15: 01: 00.001Z ")} И {" _id ": ObjectId (" 53f5c0cfe4b0d9cd24847b7d ")," appid ": 2 , «действие»: «вид», «uid»: «2_b2f58679e6f73ea3», «iid»: «2_2905040001», «t»: ISODate («2014-07-18T15: 01: 00.001Z»)} для данные щелчка

Так что я должен вывести makeIndex или что-то вроде cronjob?

Спасибо заранее

+0

Используйте TTL-индексы в MongoDB – vmr

ответ

3

Есть несколько встроенных в технологии, которые можно использовать. Наиболее очевидным является TTL collection, который автоматически удалит документы на основе поля даты/времени. Здесь предостережение заключается в том, что для этого удобства вы теряете контроль. Вы будете автоматически удалять все время, когда у вас нет контроля, а удаление не является бесплатным - для них требуется блокировка записи, их необходимо очистить на диске и т. Д. В принципе, вы захотите проверить, может ли ваша система работать уровень удалений, который вы будете делать, и как это влияет на вашу производительность.

Другой вариант: capped collection - коллекции с ограниченным доступом предварительно выделены на диск и не растут (за исключением индексов), они не имеют одинаковых накладных расходов, как это делает удаление TTL (хотя опять же, а не бесплатно). Если у вас есть согласованная скорость вставки и размер документа, вы можете определить, сколько места соответствует временному кадру, который вы хотите сохранить. Возможно, 20GiB составляет 5 дней, поэтому для обеспечения безопасности вы выделяете 30GiB и следите за тем, чтобы время от времени отслеживать, чтобы ваш размер данных не изменился.

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

Другая альтернатива: вы можете начать запись в новую базу данных каждые X дней в предсказуемом шаблоне, чтобы ваше приложение узнало, что такое имя текущей базы данных, и может определять имена предыдущих 2. Когда вы создаете новый базы данных, вы удаляете одну из них, которая старше предыдущих двух, и по существу всегда имеет 3 (в соответствующих номерах). Это звучит как большая работа, но преимущество в том, что удаление старых данных - это просто команда базы данных сбрасывания, которая просто отключает/удаляет файлы данных на уровне ОС и намного эффективнее с точки зрения ввода-вывода, чем случайное удаление документы из серии больших файлов. Эта модель также позволяет использовать очень чистую резервную модель - mongodump старой базы данных, сжатие и архивирование, затем падение и т. Д.

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

+0

Это должно быть принято как ответ. Он отвечает на все методы и сценарии, чтобы выполнять «контроль и истечение данных базы данных манго». Великий! + 1 – Xianlin

Смежные вопросы