Создание коротких уникальных идентификаторов объектов в MongoDB - PullRequest
14 голосов
/ 11 мая 2011

Я делаю приложение, похожее на Instagram, используя Rails / Mongoid. Я хочу уникальный идентификатор, который я могу использовать в URL-адресе, например http://instagr.am/p/DJmU8/

Какой самый простой способ сделать это? Могу ли я получить такой идентификатор из BSON ObjectID по умолчанию, который создает Mongo?

Ответы [ 6 ]

10 голосов
/ 11 мая 2011

Вы можете попытаться использовать первые 4 байта ObjectID (они будут представлять временную метку).

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

Более подробную информацию о структуре ObjectID mongo можно найти здесь: http://www.mongodb.org/display/DOCS/Object+IDs

В качестве альтернативы вы можете конвертировать преобразование представления шестнадцатеричной строки в id.в представление, основанное на 36 символах (26 латинских букв + 10 цифр).Очевидно, он будет короче.

Кажется, что существует библиотека ruby, которая может выполнять такие преобразования http://rubyworks.github.com/radix/

6 голосов
/ 07 января 2013

Вы можете попробовать Mongoid :: Token

https://github.com/thetron/mongoid_token

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

Эта библиотека - быстрый и простой способ генерировать уникальные, случайные токены для ваших документов mongoid, в случаях, когда вы не можете, или не хочу использовать слагов или идентификаторы MongoDB по умолчанию.

Mongoid :: Токен может помочь превратить это:

http://myawesomewebapp.com/video/4dcfbb3c6a4f1d4c4a000012/edit

На что-то вроде этого:

http://myawesomewebapp.com/video/83xQ3r/edit

4 голосов
/ 19 мая 2017

Почему бы не использовать Диланг / шортид ?

В мангусте:

_id: {
    type: String,
    'default': shortid.generate
},

или просто вставить напрямую:

users.insert({
    _id: shortid.generate()
    name: ...
    email: ...
    });
2 голосов
/ 11 ноября 2011

Попробуйте драгоценный камень https://github.com/jffjs/mongoid_auto_inc

1 голос
/ 13 мая 2019

@ aav упоминалось, что вы можете использовать первые 4 байта, но это значение указано в секундах, и вы можете получить даже 10.000 или более вставок в секунду. Еще один объект objectID - это Uniq, и вам нужно проверить «когда» вы получаете ошибку из дублирующегося значения «Записать проблемы»?

new Date (). GetTime () - в миллисекундах => 1557702577900 почему бы не использовать последние 4 байта?

Этот код выглядит интересно:

https://github.com/treygriffith/short-mongo-id/blob/master/lib/objectIdToShortId.js

Проверьте также синтаксический анализатор меток времени ObjectID:

https://steveridout.github.io/mongo-object-time/

Или вы можете выполнить ObjectId (). ToString () и основание этой строки создать новое с помощью хешей [nodejs, php, andmanymore]

Возможно, лучше всего использовать 4-5 байт из js timestamp и INC из Затем bson хеширует это значение с помощью hids

enter image description here

Database 3milion rows numeric increment "_id" size on disk => 76MB, default object id => 86MB
0 голосов
/ 21 мая 2017

Библиотека Hashids предназначена для генерации таких идентификаторов. Проверьте это здесь ☞ https://github.com/peterhellberg/hashids.rb

...