Создание короткого уникального идентификатора объекта в MongoDB
Я делаю приложение, похожее на instagram, используя Rails/Mongoid. Я хочу уникальный идентификатор, который я могу использовать в URL-адресе, например http://instagr.am/p/DJmU8/
Какой самый простой способ сделать это? Могу ли я получить такой идентификатор из стандартного BSON ObjectID Mongo создает?
Ответы
Ответ 1
Вы можете попытаться использовать первые 4 байта ObjectID (они будут представлять метку времени).
Но, чтобы быть на 100% безопасным, лучше создать действительно уникальный короткий идентификатор с помощью счетчика. Вы можете использовать отдельную коллекцию для поддержания текущей стоимости вашего счетчика.
Более подробную информацию о структуре ObjectID Монго можно найти здесь: http://www.mongodb.org/display/DOCS/Object+IDs
В качестве альтернативы вы можете преобразовать преобразование шестнадцатеричного представления идентификатора строки в представление, основанное на 36 символах (26 латинских букв + 10 цифр). Это будет очевидно короче.
Кажется, что есть библиотека ruby, которая может делать такие преобразования http://rubyworks.github.com/radix/
Ответ 2
Вы можете попробовать Mongoid:: Token
https://github.com/thetron/mongoid_token
Из документов:
Эта библиотека представляет собой быстрый и простой способ генерации уникальных случайных жетоны для ваших документов с мангой, в тех случаях, когда вы не можете, или не хотите использовать слизняки или идентификаторы MongoDB по умолчанию.
Mongoid:: Token может помочь это сделать:
http://myawesomewebapp.com/video/4dcfbb3c6a4f1d4c4a000012/edit
В нечто более похожее:
http://myawesomewebapp.com/video/83xQ3r/edit
Ответ 3
Почему бы не использовать dylang/shortid?
В мангусте:
_id: {
type: String,
'default': shortid.generate
},
или просто вставить напрямую:
users.insert({
_id: shortid.generate()
name: ...
email: ...
});
Ответ 4
Попробуйте gem https://github.com/jffjs/mongoid_auto_inc
Ответ 5
Библиотека Hashids предназначена для генерации идентификаторов, подобных этому. Проверьте это здесь ☞ https://github.com/peterhellberg/hashids.rb
Ответ 6
@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(), и база этой строки создаст новый с помощью hashids [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
Ответ 7
Хорошо использовать ObjectID в качестве уникального идентификатора, вы можете создать его с помощью драйверов базы данных MongoDB с помощью ObjectID.
Этот уникальный идентификатор является следующим:
- во-первых, 4 байта это секунды
- второе 5-байтовое случайное значение
- третий 3-х байтовый случайный счетчик
Вы можете создать его с помощью ObjectID():
const mongo = require('mongodb')
let uniqueObjectId = = new mongo.ObjectID();
Вы можете создать уникальный идентификатор вручную, используя идентификатор процесса, временную метку, случайный идентификатор и перемешать полную строку.
let processId = process.pid;
//create randomId with length of 30
var randomId = '';
var characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
var charactersLength = characters.length;
for (var i = 0;i < 30;i++) {
randomId += characters.charAt(Math.floor(Math.random() * charactersLength));
}
let timestemp = parseInt(Date.now() / 1000, 10);
let fullUniqString = processId + randomId + timestemp;
let uniqueObjectId = fullUniqString.split('').sort(function () { return 0.5 - Math.random() }).join('');
console.log(uniqueObjectId);