如何在MongoDB 6.0的mongosh中默认使用旧版UUID?
解决方案:让MongoDB 6.0 mongosh默认生成旧版UUID(BSON subtype 3)
mongosh没有原生配置项让UUID()默认生成subtype3的旧版UUID,但可以通过自定义全局函数覆盖默认行为的方式实现,完全适配同事的使用习惯,步骤如下:
1. 编写自定义UUID函数
创建一个替换默认UUID()的函数,解析输入的UUID字符串(支持带连字符/不带连字符格式),生成符合要求的BinData(3, ...):
globalThis.UUID = function(uuidStr) { // 移除UUID字符串中的连字符 const cleanedUuid = uuidStr.replace(/-/g, ''); // 将十六进制字符串转换为字节数组 const byteArray = []; for (let i = 0; i < cleanedUuid.length; i += 2) { byteArray.push(parseInt(cleanedUuid.substr(i, 2), 16)); } // 转换为Base64编码,生成subtype3的BinData return BinData(3, btoa(String.fromCharCode(...byteArray))); };
这个函数的行为和MongoDB 5.0经典shell的旧版UUID生成逻辑一致,确保生成的BinData和pymongo创建的subtype3 UUID兼容。
2. 配置mongosh自动加载该函数
将上述函数写入mongosh的启动配置文件,实现每次启动自动生效:
- Linux/macOS:编辑
~/.mongoshrc.js文件(如果不存在则新建),粘贴函数代码后保存。 - Windows:编辑
%USERPROFILE%\.mongoshrc.js文件(同样,不存在则新建),粘贴函数代码后保存。
3. 验证效果
重启mongosh后,调用UUID()将默认生成subtype3的旧版UUID:
> UUID("c19f6bdf-e680-4059-8b9a-a19bb879abb3") BinData(3,"wZ9r3+aAQFmLmqGbuHmrsw==") > UUID("c19f6bdfe68040598b9aa19bb879abb3") BinData(3,"wZ9r3+aAQFmLmqGbuHmrsw==")
临时使用新版UUID
如果需要临时生成subtype4的新版UUID,直接调用mongosh原生的BSON.UUID()即可:
> BSON.UUID("c19f6bdf-e680-4059-8b9a-a19bb879abb3") UUID("c19f6bdf-e680-4059-8b9a-a19bb879abb3")
这种方案既满足了同事的使用习惯,避免误生成新版UUID破坏逻辑,又保留了过渡期间灵活切换UUID类型的能力,完全适配你的迁移需求。
内容的提问来源于stack exchange,提问作者Messa
相关产品推荐
相关产品推荐

