Подтвердить что ты не робот

Разница между хранением ObjectId и его строковой формой, в MongoDB

Меня немного смущает использование Mongo DB ObjectIds. Конечно, они отлично подходят для создания клиентской части ID, которые почти наверняка не конфликтуют с другими созданными на стороне клиента идентификаторами. Но манго, кажется, хранит их каким-то особым образом. Сохранение строкового представления идентификатора отличается от хранения идентификатора объекта как объекта. Почему это?

Не имеет ли форма строки одинаковая информация, которую имеет форма объекта? Почему манго подходит к такой длине, чтобы различать эти две формы? Это замарывает меня, когда я пытаюсь сравнить _ids, отправленные из интерфейса, например. Моя база данных никоим образом не согласуется с тем, хранит ли она идентификаторы формы строки или идентификаторы объектной формы, и мой код, безусловно, частично виноват, я в основном обвиняю монго, чтобы сделать это настолько странным.

Я ошибаюсь, что это странно? Почему манго делает это так?

4b9b3361

Ответ 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, поэтому я буду использовать это при создании новых документов.