MongoDB: возможно ли избежать использования автоматического поля _id? - PullRequest
5 голосов
/ 12 ноября 2011

У меня есть уникальное поле идентификатора типа int в моих документах. Я делаю ensureIndex в этом поле, но мои документы все еще содержат _id. Можно ли от него избавиться?

Ответы [ 3 ]

4 голосов
/ 12 ноября 2011

Из документов ...

Если пользователь пытается вставить документ без указания поля _id, база данных автоматически сгенерирует идентификатор объекта и сохраните его в поле _id.

Однако вы можете присвоить собственное значение _id ...

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

Лучший вопрос - зачем вам создавать свой собственный уникальный идентификатор, создавать индекс для него и удалять очень полезный ObjectID _id , который автоматически индексируется?

Все официальные драйверы используют ObjectID, и у него много действительно хороших аспектов:

  • Он имеетвстроенная временная метка (поэтому вам не нужно хранить поле даты в документе, и вы можете использовать его для упорядочения по дате.)

  • Это глобально, единообразноувеличение порядкового номера "--- т.е. он будет по-прежнему уникальным на всех серверах, если вам потребуется защитить данные и т. д.

2 голосов
/ 13 ноября 2011

Хорошей идеей было бы сохранить ваш хэш в поле _id.

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

Просто установите поле _id как любое другое с помощьюзначение, которое вы хотите (например, ваш хэш).Но будьте осторожны, он должен быть уникальным!

Чтобы обеспечить уникальность, вы должны либо сделать его уникальным, либо поместить поддокумент в поле _id: {_id: {h: [yourHash], u: [уникальный идентификатор]}, ...}

2 голосов
/ 12 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...