2024-06-01 03:01:13 发布
网友
我已经构建了许多python驱动的站点,它们利用mongodb作为数据库后端,并且对它的ObjectId系统非常满意,但是,我希望能够以更短的方式对id进行编码,而不需要构建映射集合或使用url shortener服务。在
建议?成功案例?在
如果你试图保留原来的价值,那么真的没有一个好办法。你可以对它进行编码,但它变小的可能性很小。你可以把它弄碎,但那是不可逆的。在
如果这是一个需求,我可能建议创建一个查找表或集合,其中少量增量引用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)
如果你试图保留原来的价值,那么真的没有一个好办法。你可以对它进行编码,但它变小的可能性很小。你可以把它弄碎,但那是不可逆的。在
如果这是一个需求,我可能建议创建一个查找表或集合,其中少量增量引用Mongo集合中的条目。在
你可以把它们压缩成以62为基数的数字。这不会节省很多空间,但是它确实为每个ID节省了一些字节。在
嘿,我最近也想要同样的东西。在
我最后要做的是给每个需要的文档一个唯一的“public id”(比如ObjectId),但这只是一个自动递增的数字(所以在数字变大之前需要一段时间,如果是十六进制编码的话,甚至更长)。通过这种方式,我可以在内部使用ObjectId(我怀疑这会更快),并使用外部引用的文档的公共id来查找它们
请注意,在创建这些公共id时,性能会受到一些影响,因为每个公共id都需要对文档进行原子更新(所以您应该只在需要它们的地方使用它们)。在
创建一个自动递增的数字的关键是MongoDB的^{} command 在单个原子操作中同时递增值和返回旧值。在
由于您正在使用Python,我也在使用,下面是我当前使用的代码(注意,它还没有投入生产):
相关问题 更多 >
编程相关推荐