Разница между хранением ObjectId и его строковой формой, в MongoDB
Меня немного смущает использование Mongo DB ObjectIds. Конечно, они отлично подходят для создания клиентской части ID, которые почти наверняка не конфликтуют с другими созданными на стороне клиента идентификаторами. Но манго, кажется, хранит их каким-то особым образом. Сохранение строкового представления идентификатора отличается от хранения идентификатора объекта как объекта. Почему это?
Не имеет ли форма строки одинаковая информация, которую имеет форма объекта? Почему манго подходит к такой длине, чтобы различать эти две формы? Это замарывает меня, когда я пытаюсь сравнить _ids, отправленные из интерфейса, например. Моя база данных никоим образом не согласуется с тем, хранит ли она идентификаторы формы строки или идентификаторы объектной формы, и мой код, безусловно, частично виноват, я в основном обвиняю монго, чтобы сделать это настолько странным.
Я ошибаюсь, что это странно? Почему манго делает это так?
Ответы
Ответ 1
Я лично обвиняю ваш код. Я отлично разбираюсь в своих приложениях, кодируя правильный путь. Я конвертирую строку в код для сравнения, и я гарантирую, что все, что выглядит как ObjectId
, фактически используется как ObjectId
.
Хорошо отметить, что между ObjectId
(http://docs.mongodb.org/manual/reference/object-id/) и шестнадцатеричным представлением на самом деле имеется 12 байт разницы, ObjectId
составляет 12 байтов, а шестнадцатеричное представление - 24.
Это не только эффективность хранения, но и индексы; не только потому, что они меньше, но и потому, что ObjectId
можно использовать особым образом, чтобы гарантировать загрузку только частей индекса; которые используются. Это становится наиболее заметным при вставке, где требуется только самая последняя часть этого индекса для обеспечения уникальности. Вы не можете гарантировать такое поведение с его шестнадцатеричным представлением.
Я настоятельно рекомендую вам не использовать шестнадцатеричное представление OjbectId
. Если вы хотите "облегчить свою жизнь", вам будет лучше создать другой _id
, который меньше, но как-то так же уникален и удобен для индексирования.
Ответ 2
ObjectId
составляет 12 байтов, когда он хранится внутри, что более компактно, чем шестнадцатеричное представление строки. Это разные вещи.
Вы можете оплатить всю вашу БД и использовать единое поле _id
, чтобы решить эту проблему и убедитесь, что ваш код сохраняет в том же формате. ObjectId
быстро генерируются MongoDB, поэтому я буду использовать это при создании новых документов.