MongoDB. Часть 3.

Apr 16, 2015 04:05 · 385 words · 2 minutes read mongodb

Косвенно мы уже упоминали о том, что проект НГС.Авто использует MongoDB в качестве основного хранилища данных. Логично, что за время использования этого решения на бою у нас накопилось некоторые рекомендации по работе с ним. Этими рекомендациями и нюансами нам хотелось бы поделиться с вами. И первое, что стоит обсудить - MongoID.

Наверняка, многие из вас знают, что в большинстве реляционных и нереляционных (NoSql) баз данных используются первичные ключи. Первичный ключ — это поле или набор полей со значениями, которые являются уникальными для всей таблицы. Значения ключа могут использоваться для обозначения всех записей, при этом каждая запись имеет отдельное значение ключа. В качестве такого первичного ключа в MongoDB по умолчанию используется MongoID. Это значит, что при вставке любого документа в коллекцию к нему будет добавлено поле вида: "_id": ObjectId("540429f48a88af719aae71d5").

Что же такое MongoID? Это 12 байтный тип данных в формате BSON, который использует MongoDB для хранения уникальных идентификаторов. Из них: * 4 байта - отметка времени (timestamp) * 3 байта - хеш имени хоста клиента * 2 байта - последние 2 значащих байта идентификатора процесса исполнения скрипта * 2 байта - автоинкрементное значение

Эти объекты могут быть легко сериализованы и десериализованы.

Так что же такого полезного в MongoID? Какие плюсы можно выделить?

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

Из минусов можно отметить плохую читаемость. Достаточно сложно будет запомнить набор символов - 540429f48a88af719aae71d5. А теперь представьте, что это будет идентификатор объявления? Не всегда удобно, согласитесь :)

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

Если внимательно посмотреть на то, из чего состоит MongoID - то можно увидеть, что первые 4 байта - это текущая отметка времени. Как приятный бонус - эту временную метку (timestamp) можно легко достать.

Подводя итог, можно сказать следующее: Если в вашем проекте отсутствуют требования по удобочитаемости идентификатора, то можно смело использовать MongoID. Из-за присутствия метки времени можно отказаться от хранения даты создания документа - её всегда можно будет достать из идентификатора документа. Кроме того, используя MongoID вы делаете вклад в развитие проекта на перспективу: в тот момент, когда вам понадобится шардинг, MongoID отлично с ним сработается :)

P.S. Документация по MongoID