關(guān)于MongoDB圖片URL存儲(chǔ)異常問(wèn)題以及解決
MongoDB圖片URL存儲(chǔ)異常問(wèn)題
項(xiàng)目場(chǎng)景
在開(kāi)發(fā)一個(gè)在線考試系統(tǒng)時(shí),前端需要提交學(xué)生的答題截圖到后端,后端使用 MinIO 存儲(chǔ)圖片并保存圖片 URL 到 MongoDB 數(shù)據(jù)庫(kù)。
系統(tǒng)需要支持多次提交圖片,并將所有圖片 URL 以數(shù)組形式存儲(chǔ)在 MongoDB 的 screenShot 字段中。
問(wèn)題描述
當(dāng)存儲(chǔ)少量圖片時(shí),URL 顯示正常(如 @http://10.100.157.90:9200/test-bucket/exam_1.png)
但當(dāng)圖片數(shù)量增多后,screenShot 字段存儲(chǔ)的內(nèi)容變成了多層嵌套的 JSON 字符串,包含大量轉(zhuǎn)義字符和斜杠
例如:
"screenShot": ["{\"screenShot\": [\"{\\\"screenShot\\\": [\\\"{\\\\\\\"screenShot\\\\\\\": [\\\\\\\"...\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"]}\"]}"]原因分析
- 數(shù)據(jù)序列化問(wèn)題:每次保存新圖片時(shí),系統(tǒng)從數(shù)據(jù)庫(kù)獲取現(xiàn)有的
screenShot字段內(nèi)容,但沒(méi)有正確處理可能已經(jīng)存在的 JSON 字符串 - 嵌套序列化:每次更新時(shí),整個(gè)數(shù)組被錯(cuò)誤地序列化為 JSON 字符串,然后作為新元素添加到數(shù)組中
- 缺乏數(shù)據(jù)清理:系統(tǒng)沒(méi)有對(duì)從數(shù)據(jù)庫(kù)讀取的已有數(shù)據(jù)進(jìn)行清理和驗(yàn)證,導(dǎo)致問(wèn)題不斷累積
- MongoDB 操作不當(dāng):更新 MongoDB 字段時(shí),可能使用了不恰當(dāng)?shù)男蛄谢绞?/li>
解決方案
1.使用 MongoDB 的數(shù)組操作符(如 $push)直接更新數(shù)組,而不是替換整個(gè)字段
2.或者使用數(shù)據(jù)清理(可選,不建議)
預(yù)防措施
- 在數(shù)據(jù)存儲(chǔ)前進(jìn)行嚴(yán)格的格式驗(yàn)證
- 添加單元測(cè)試驗(yàn)證數(shù)據(jù)序列化和反序列化邏輯
- 對(duì)數(shù)據(jù)庫(kù)中的現(xiàn)有數(shù)據(jù)進(jìn)行定期檢查和清理
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java觀察者模式實(shí)現(xiàn)和java觀察者模式演化
觀察者模式是經(jīng)典設(shè)計(jì)模式中很常用的一種,平常我們看到的監(jiān)聽(tīng)器,基本上都是采用這種設(shè)計(jì)模式實(shí)現(xiàn)的,這里探討一下觀察者模式的演化2014-02-02
SpringBoot線程池ThreadPoolTaskExecutor異步處理百萬(wàn)級(jí)數(shù)據(jù)
本文主要介紹了SpringBoot線程池ThreadPoolTaskExecutor異步處理百萬(wàn)級(jí)數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03
Java反射(Class類(lèi),Class對(duì)象獲取)
下面是對(duì)Java反射機(jī)制是在程序的運(yùn)行過(guò)程中,Java語(yǔ)言的反射機(jī)制的超詳細(xì)解說(shuō),點(diǎn)進(jìn)來(lái)的小伙伴不要錯(cuò)過(guò)奧2021-08-08
java:程序包c(diǎn)om.xxx.xxx不存在報(bào)錯(cuò)萬(wàn)能解決辦法
這篇文章主要給大家介紹了關(guān)于java:程序包c(diǎn)om.xxx.xxx不存在報(bào)錯(cuò)萬(wàn)能解決辦法,這個(gè)問(wèn)題曾逼瘋初學(xué)者的我,不過(guò)弄清楚原理后就很簡(jiǎn)單了,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
Java實(shí)現(xiàn)樹(shù)形List與扁平List互轉(zhuǎn)的示例代碼
在平時(shí)的開(kāi)發(fā)中,我們時(shí)常會(huì)遇到需要將"樹(shù)形List"與"扁平List"互轉(zhuǎn)的情況,本文為大家整理了Java實(shí)現(xiàn)樹(shù)形List與扁平List互轉(zhuǎn)的示例代碼,希望對(duì)大家有所幫助2023-05-05
基于Java Socket實(shí)現(xiàn)一個(gè)簡(jiǎn)易在線聊天功能(一)
這篇文章主要給大家介紹基于Java Socket實(shí)現(xiàn)一個(gè)簡(jiǎn)易在線聊天功能(一),分為客戶(hù)端和服務(wù)端兩段代碼,非常具有參考價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05

