Как можно сократить идентификаторы монго для лучшего использования в URL-адресах?

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

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

Ответы

Ответ 1

Вы можете сжать их как номера Base62. Это не экономит много места, но это сэкономит вам несколько байт на ID. Мой пример 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"

Ответ 2

Хе-хе, я недавно хотел точно то же самое.

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

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

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

Поскольку вы используете 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)

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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