2013-04-07 3 views
2

В MongoDb ObjectId - это 12-байтовый тип BSON.Изменить размер объекта

Есть ли способ уменьшить размер объекта ID?

+0

Возможно, я не понимаю ваш вопрос, но как уменьшить его? Он разработан, чтобы быть простым и эффективным способом получения уникального идентификатора, определенного в настройке нескольких машин: 4-байтовое значение, представляющее секунды с эпохи Unix, 3-байтовый идентификатор машины, 2-байтовый идентификатор процесса и 3-байтовый счетчик, начиная со случайного значения. – WiredPrairie

+1

Это невозможно, но вы можете использовать целое число как '_id' вместо ObjectId, чтобы использовать только 4 байта. – assylias

+0

Какой язык, инфраструктура драйвера и картографии (если есть) вы используете? – Sim

ответ

2

№ Это тип данных BSON. Это похоже на то, что 32-битное целое число сжимается. Каждый объект должен иметь _id объект, но вы не ограничены только ObjectId.

+1

Дополнение: Каждый документ верхнего уровня * в коллекции MongoDB должен иметь _id, который действует как первичный ключ. Если это свойство не установлено в коде, оно автоматически назначается драйвером или базой данных. – WiredPrairie

0

Каждый документ в коллекции MongoDB должен иметь уникальный _id, но значение не обязательно должно быть ObjectId. Поэтому, если вы хотите, чтобы уменьшить размер документов в вашей коллекции у вас есть два варианта:

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

  2. Управление первичными ключами для коллекции самостоятельно. Многие драйверы поддерживают пользовательские primary key factories. Как подсказывает @assylias, переход с int даст вам хорошую экономию пространства, но, тем не менее, вы будете использовать больше места, чем если бы вы могли использовать одно из полей вашей модели в качестве _id.

КСТАТИ значение из _id поля может быть составным: вы можете использовать объект/хэш/карту/словарь. См., Например, this SO question.

Если вы используете какой-либо тип рамки объекта/модели сверху Монго, я буду осторожен с (1). Некоторым структурам приходится сталкиваться с трудностями, когда разработчики переопределяют создание идентификаторов. Например, у меня был плохой опыт работы с Mongoid в Ruby. В этом случае (2) может быть более безопасным способом перехода, поскольку генерация происходит на уровне драйвера.

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