Windows端MongoDB Compass导入导出文档时如何保留UUID
解决方案
方案1:直接在库内删除目标字段(优先选择)
无需导出导入,直接通过MongoDB Shell执行批量更新即可删除指定字段,完全不会改动原有UUID数据,命令如下:
// 替换your_collection为目标集合名,替换target_field为待删除的字段名 db.your_collection.updateMany({}, {$unset: {"target_field": ""}})
方案2:批量修复已损坏的UUID数据
如果已完成导入需要修复现有异常数据,可通过MongoDB Shell执行批量转换脚本,逻辑为提取异常Binary的有效16位UUID字节,重新写入为标准UUID格式,参考脚本如下:
// 替换your_collection为目标集合名,_id、related_id替换为实际存储UUID的字段名 db.your_collection.find().forEach(doc => { // 处理文档ID字段 if (typeof doc._id === 'object' && doc._id._bsontype === 'Binary') { let validBuf = doc._id.buffer.slice(0,16); // subType替换为业务实际使用的03或04 doc._id = new BinData(04, validBuf.toString('base64')); } // 处理其他关联UUID字段,可按实际业务场景添加多个字段处理逻辑 if (typeof doc.related_id === 'object' && doc.related_id._bsontype === 'Binary') { let validBuf = doc.related_id.buffer.slice(0,16); doc.related_id = new BinData(04, validBuf.toString('base64')); } db.your_collection.save(doc); })
方案3:正确的全量导出导入方案
后续需要做全量导出导入操作时,不要使用Compass的JSON导出导入功能,改用MongoDB官方mongodump和mongorestore工具,原生支持BSON类型完整保留,UUID的类型、值、subType完全不会变化,还支持直接排除指定字段导入:
# 导出指定集合 mongodump -d 数据库名 -c 集合名 -o 导出目录路径 # 导入时排除指定字段,--drop会先删除原有集合再导入 mongorestore -d 数据库名 -c 集合名 --drop --excludeFields=待删除字段名 导出目录路径/数据库名/集合名.bson
内容的提问来源于stack exchange,提问作者Kappacake
相关产品推荐
相关产品推荐

