2014-02-14 132 views
8

我正在考慮在我的mongoDB 中存儲data-url s,而不是存儲對文件的引用或使用GridFS。在MongoDB中存儲數據url

傳輸數據的URL:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAAEsCAYAAAB38aczAAAgAElEQV 

我保存的所有文件都是JPG或PNG,並且在尺寸小於1MB。

我想知道這是否被認爲是不好的做法,以及什麼性能影響讀取和寫入操作,將data-url s 1)存儲在一個單獨的集合2)作爲集合中的元數據。

我接受任何其他關於小文件存儲的建議。

回答

6

首先,我不會將base64編碼數據存儲在完全有能力存儲二進制數據的數據庫中。這只是浪費空間。存儲圖像本身,而不是它的base64表示,即不是data : "VBORw0KGgoAAAANSUhEUgAAA...",而是data : BinData("VBORw0KGgoAAAANSUhEUgAAA...")(前者是MongoDB的字符串,後者是二進制數據)。 Base64增加了33%的大小。

除此之外,我認爲這很好。權衡是一個抓取所有數據與多個請求的請求。存儲大塊數據的缺點是所有數據都必須在RAM中暫存一次,但在1MB時這可能不是問題。

但是,您應該確保在您不需要圖像的情況下不要獲取文檔。 1MB不是太多,但對於一個重讀的集合,這是一場災難。

+0

謝謝。在我的情況下,很少需要抓取圖像,並且在該集合上執行幾個重讀查詢。我認爲爲所有現有查詢指定排除項並不是一個好主意。所以看起來我的選擇是1)將圖像存儲在我的文件服務器上,2)將二進制數據存儲在單獨的集合中,創建引用,並在必要時使用貓鼬的填充來獲取圖像。 – TaylorMac

+0

聽起來像獨立的收藏是最適合的。我在一個寵物項目中使用了相同的概念,其中二次收集被稱爲...'Images' ;-)這很好,對於這種使用模式,它比GridFS更好 – mnemosyn

+0

很高興知道您已經成功使用這種技術。再次感謝mnemosyn你的知識。 – TaylorMac