关于MongoDB图片URL存储异常问题以及解决
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.或者使用数据清理(可选,不建议)
预防措施
- 在数据存储前进行严格的格式验证
- 添加单元测试验证数据序列化和反序列化逻辑
- 对数据库中的现有数据进行定期检查和清理
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
基于SpringBoot和Vue3的博客平台文章列表与分页功能实现
在前面的教程中,我们已经实现了基于Spring Boot和Vue3的发布、编辑、删除文章功能。本教程将继续引导您实现博客平台的文章列表与分页功能,需要的朋友可以参考阅读2023-04-04
使用@RequiredArgsConstructor注解来取代繁琐的@Autowrired
有了@RequiredArgsConstructor注解,我们就可以减少@Autowired的书写,本文主要介绍了使用@RequiredArgsConstructor注解来取代繁琐的@Autowrired,感兴趣的可以了解一下2022-04-04
IDEA创建的maven项目中pom.xml增加新依赖无效问题及解决
在IDEA中,解决maven项目pom.xml增加依赖但外部库未更新的问题,可以通过设置"构建脚本更改后同步项目"选项为"任何更改",然后刷新Maven项目来解决2025-01-01


最新评论