mongodb图片url存储异常问题
项目场景
在开发一个在线考试系统时,前端需要提交学生的答题截图到后端,后端使用 minio 存储图片并保存图片 url 到 mongodb 数据库。
系统需要支持多次提交图片,并将所有图片 url 以数组形式存储在 mongodb 的 screenshot
字段中。
问题描述
当存储少量图片时,url 显示正常(如 @http://10.100.157.90:9200/test-bucket/exam_1.png
)
但当图片数量增多后,screenshot
字段存储的内容变成了多层嵌套的 json 字符串,包含大量转义字符和斜杠
例如:
"screenshot": ["{\"screenshot\": [\"{\\\"screenshot\\\": [\\\"{\\\\\\\"screenshot\\\\\\\": [\\\\\\\"...\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"]}\"]}"]
原因分析
- 数据序列化问题:每次保存新图片时,系统从数据库获取现有的
screenshot
字段内容,但没有正确处理可能已经存在的 json 字符串 - 嵌套序列化:每次更新时,整个数组被错误地序列化为 json 字符串,然后作为新元素添加到数组中
- 缺乏数据清理:系统没有对从数据库读取的已有数据进行清理和验证,导致问题不断累积
- mongodb 操作不当:更新 mongodb 字段时,可能使用了不恰当的序列化方式
解决方案
1.使用 mongodb 的数组操作符(如 $push
)直接更新数组,而不是替换整个字段
2.或者使用数据清理(可选,不建议)
预防措施
- 在数据存储前进行严格的格式验证
- 添加单元测试验证数据序列化和反序列化逻辑
- 对数据库中的现有数据进行定期检查和清理
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论