簡體   English   中英

使用Nodejs將文件存儲在mongodb中

[英]Store files in mongodb with Nodejs

我將文件保存在服務器的FS上,現在我想將它們保存在mongodb中。(為了更容易備份和填充)。我想存儲最大4-5Mb的文件,我嘗試使用帶有緩沖類型的mongoose保存它們。我成功保存並檢索了它們但是當我保存並檢索4或5Mb等文件時,我注意到性能顯着降低。

我的架構:

let fileSchema = new Schema({
name: {type: String, required: true},
_announcement: {type: Schema.Types.ObjectId, ref: 'Announcements'},
data: Buffer,
contentType: String
});

我如何從expressjs服務器檢索它們:

 let name = encodeURIComponent(file.name);
 res.writeHead(200, {
     'Content-Type': file.contentType,
     'Content-Disposition': 'attachment;filename*=UTF-8\'\'' + name
 });
 res.write(new Buffer(file.data));

我的問題是我應該使用一些zlib壓縮函數,如'deflate'來壓縮緩沖區,然后再將它們保存在mongodb中,然后在將它們發送到客戶端之前解壓縮二進制文件? 這會讓整個過程變得更快嗎?我錯過了什么嗎?

您似乎正在嘗試使用mongoDb保存大量信息。

我可以為您的案例考慮3種不同的選擇

雲服務

  • 正如其他人已在此處評論的那樣,如果您保存的文件是壓縮文件,即使它是一個小文件,新的壓縮也無法幫助您。 在這種情況下,我的建議是使用一些已針對您要保存和檢索的信息進行優化的Web雲服務,如果它是一個圖像,您可以使用Cloudinary ,它也有免費服務,以便您可以測試它。

DB中的本地存儲和保存路由

  • 其他解決方案可能是將編碼數據存儲在.txt文件中,將其存儲在雲中或文件系統中,然后僅將路由保存在數據庫中。 這樣您就不會依賴mongoDB速度來重新獲取它,但是您將有一個很好的方法來了解文件的位置。

使用MongoDB和GridFS

  • 這樣,您可以使用特定方法在MongoDB中存儲信息,在處理16mb的文件時建議使用這些信息。 正如官方文件所說:

GridFS不是將文件存儲在單個文檔中,而是將文件分成多個部分或塊[1],並將每個塊存儲為單獨的文檔。 默認情況下,GridFS使用默認的塊大小255 kB; 也就是說,GridFS將文件分成255 kB的塊,但最后一個塊除外。

接下來他們說在什么情況下你可以用這種方式存儲信息:

在某些情況下,在MongoDB數據庫中存儲大文件可能比在系統級文件系統上更高效。

  • 如果文件系統限制目錄中的文件數,則可以使用GridFS根據需要存儲任意數量的文件。
  • 如果要從大型文件的各個部分訪問信息而無需將整個文件加載到內存中,可以使用GridFS調用文件的各個部分,而無需將整個文件讀入內存。
  • 如果要保持文件和元數據在多個系統和設施中自動同步和部署,可以使用GridFS。 使用地理位置分散的副本集時,MongoDB可以自動將文件及其元數據分發到許多mongod實例和工具。

希望它有用:)

我建議你使用GridFS它更快,更容易使用。

有關詳細信息,請查看此URL: https//docs.mongodb.com/manual/core/gridfs/

如果您對GridFS有任何疑問, GridFS告訴我。

如果您絕對認為必須將圖像存儲在數據庫中而不是存儲在文件系統或其他雲服務中,我不會對此發表評論。

關於您的具體問題,GridFS是人們在生產中使用的一個值得尊敬的選擇,並且很好地實現了它的目的。 幾年前我個人使用它,但我的用例改變了,因此轉移到另一種媒介。 (請查看人們討論其性能的SO鏈接)

令人擔憂的是,你有4mb的圖像,除非你提供的圖像對質量和大分辨率有很大的依賴性 - 這不應該發生。 請在存儲之前壓縮圖像,在前端或后端(您的選擇)上進行壓縮,如果您在前端壓縮它們,那么它將減少數據包的傳輸時間。

關於GridFS規模的討論

node.js側壓縮的模塊

GridFS的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM