如何缩短mongo id以便在URL中更好地使用?

jci*_*nis 13 python mongodb

我已经构建了许多利用mongodb作为数据库后端的python驱动站点,并且对它的ObjectId系统非常满意,但是,我希望能够以更短的方式对id进行编码,而无需构建映射集合或使用网址缩短服务.

建议?成功的故事?

Chr*_*ald 12

您可以将它们压缩为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"
Run Code Online (Sandbox Code Playgroud)


Cam*_*ron 7

嘿,我最近想要自己做同样的事情.

我最终做的是给每个需要一个独特的"公共ID"的文档(比如ObjectId),但这只是一个自动递增的数字(因此在数字变大之前需要一段时间)如果它们是十六进制编码的话甚至更长.这样,我可以在内部使用ObjectId(我怀疑它更快),并使用它们的公共ID查找外部引用的文档.

请注意,创建这些公共ID时会有一点性能损失,因为每个公共ID需要对文档进行原子更新(因此您只应在需要它们的地方使用它们).

创建自动递增数字的关键是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)
Run Code Online (Sandbox Code Playgroud)