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