Как можно сократить идентификаторы Монго для лучшего использования в URL? - PullRequest
13 голосов
/ 24 ноября 2010

Я создал несколько сайтов, управляемых Python, которые используют mongodb в качестве базы данных, и очень доволен его системой ObjectId, однако мне бы хотелось иметь возможность кодировать идентификаторы более коротким способом без создания набора карт или используя службу сокращения URL-адресов.

Предложения? Истории успеха?

Ответы [ 5 ]

12 голосов
/ 24 ноября 2010

Вы можете сжать их как числа Base62.Это не экономит много места, но позволяет сэкономить несколько байтов на каждый идентификатор.Ruby моего примера, но подобное использование в Python не составит труда.

ree-1.8.7-2010.02 > User.first._id.to_s
 => "4c76f3dd98db74697500003b"

ree-1.8.7-2010.02 > User.first._id.to_s.to_i(16).base62_encode
 => "uMarF7LmpY3bNOSn"
7 голосов
/ 24 ноября 2010

Хех, я недавно хотел точно такую ​​же вещь.

В итоге я дал каждому документу, которому нужен один «публичный идентификатор», который уникален (например, ObjectId), но это просто автоматически увеличивающееся число (так что потребуется некоторое время, прежде чем числа становятся огромными, и даже больше, если они закодированы в шестнадцатеричном формате). Таким образом, я могу использовать ObjectId для внутреннего использования (что, я подозреваю, быстрее) и искать внешние ссылки на документы, используя их открытый идентификатор.

Обратите внимание, что при создании этих общедоступных идентификаторов наблюдается небольшое снижение производительности, поскольку каждый из них требует атомарного обновления документа (поэтому вы должны использовать их только там, где они вам нужны).

Ключом к созданию числа с автоинкрементом является команда findAndModify MongoDB , которая увеличивает значение и возвращает старое значение в одной атомарной операции.

Поскольку вы используете Python, и я тоже, вот код, который я сейчас использую (обратите внимание, что он еще не работает):

from pymongo import Connection
from pymongo.son import SON

db = Connection().mydatabase

PUBLIC_ID_COLLECTION = 'next_public_id'
def next_public_id():
    result = db.command(SON({ 'findandmodify': PUBLIC_ID_COLLECTION },
        query = { '_id': 'manager' },
        update = { '$inc': { 'next_public_id': 1 } },
        upsert = True       # Insert if not already existing
    ))
    manager = result['value']
    return manager.get('next_public_id', 0)
1 голос
/ 24 ноября 2010

Я поднял эту тему некоторое время назад в списке рассылки mongodb.Посмотрите, может ли это вам помочь.

Пользовательский _id

1 голос
/ 24 ноября 2010

Если вы пытаетесь сохранить исходное значение, то на самом деле нет хорошего пути. Вы можете закодировать его, но вероятность того, что он будет меньше, минимальна. Вы могли бы хешировать это, но тогда это не обратимо.

Если это ТРЕБОВАНИЕ, я, вероятно, рекомендую создать справочную таблицу или коллекцию, где небольшое добавочное число ссылается на записи в коллекции Mongo.

0 голосов
/ 28 декабря 2011

Если вы можете сгенерировать уникальные числа с автоинкрементом, абсолютно не нужно использовать ObjectId для _id.Делать это в распределенной среде, скорее всего, будет дороже, чем использовать ObjectId.Это ваш компромисс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...