如何缩短mongoid以便更好地在url中使用?

2024-06-01 03:01:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

建议?成功案例?在


Tags: id数据库url利用编码站点mongodb系统
3条回答

如果你试图保留原来的价值,那么真的没有一个好办法。你可以对它进行编码,但它变小的可能性很小。你可以把它弄碎,但那是不可逆的。在

如果这是一个需求,我可能建议创建一个查找表或集合,其中少量增量引用Mongo集合中的条目。在

你可以把它们压缩成以62为基数的数字。这不会节省很多空间,但是它确实为每个ID节省了一些字节。在

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"

嘿,我最近也想要同样的东西。在

我最后要做的是给每个需要的文档一个唯一的“public id”(比如ObjectId),但这只是一个自动递增的数字(所以在数字变大之前需要一段时间,如果是十六进制编码的话,甚至更长)。通过这种方式,我可以在内部使用ObjectId(我怀疑这会更快),并使用外部引用的文档的公共id来查找它们

请注意,在创建这些公共id时,性能会受到一些影响,因为每个公共id都需要对文档进行原子更新(所以您应该只在需要它们的地方使用它们)。在

创建一个自动递增的数字的关键是MongoDB的^{} command在单个原子操作中同时递增值和返回旧值。在

由于您正在使用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)

相关问题 更多 >