Chúng tôi thường cần lưu trữ các tệp trong cơ sở dữ liệu của mình, nhưng mongoDB không cho phép bạn lưu trữ bất kỳ tệp nào lớn hơn 16 Mb trong một tài liệu thông thường. Thay vào đó, MongoDB có một chức năng đặc biệt để lưu trữ các tệp lớn và nó có tên là GridFS
GridFS chia tệp thành nhiều phần và sau đó lưu trữ chúng trong cơ sở dữ liệu
GridFS lưu trữ các tệp trong các nhóm, là một nhóm các bộ sưu tập MongoDB bao gồm các khối tệp và thông tin tệp. GridFS có các bộ sưu tập này
Tệp - [cái này lưu trữ siêu dữ liệu tệp]
Chunks - [cái này lưu trữ các khối tệp nhị phân]
Khi chúng tôi tạo một nhóm GridFS, nó sẽ tự động tạo các tệp và khối bộ sưu tập trong nhóm. Nhóm GridFS theo mặc định được đặt tên là fs
Khi nào bạn nên sử dụng GridFS?
Nếu hệ thống tệp của bạn có giới hạn về số lượng tệp
Khi bạn cần truy cập một phần của tệp lớn mà không cần tải toàn bộ tệp
Khi bạn muốn lưu trữ và đồng bộ hóa các tệp và siêu dữ liệu trên các hệ thống phân tán
Trong bài này chúng ta sẽ thảo luận
Tạo thùng GridFS
Đang tải tệp lên
Truy xuất thông tin tệp
Tải tập tin
Đổi tên tập tin
Xóa một tập tin
Xóa một thùng
Trong bài viết này, chúng tôi sẽ sử dụng phiên bản đám mây của MongoDB, còn được gọi là Atlas
Tạo nút của bạn. js và nhận MongoDB Atlas URI để kết nối với máy khách nodejs của bạn
Bạn có thể tham khảo bài viết này về Cách lấy MongoDB Atlas URI
Tạo một dự án nút và khởi tạo npm trong đó,
1 2 3
mkdir gridfs - tutorial cd gridfs - tutorial npm init - y
Cài đặt các mô-đun npm cần thiết cho ứng dụng của chúng tôi
Express [khuôn khổ để thiết kế API]
Mongoose [ORM cho MongoDB]
Multer [mô-đun để dễ dàng tải lên tệp]
Multer-gridfs-storage [mô-đun để triển khai gridfs với bộ trộn]
npm i -S express mongoose dotenv multer multer-gridfs-storage
Cài đặt gật đầu dưới dạng phụ thuộc dev
npm i --save-dev nodemon
Tạo ứng dụng. js và viết mã
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
const express = require["express"]; const app = express[]; const mongoose = require["mongoose"]; const multer = require["multer"]; const { GridFsStorage } = require["multer-gridfs-storage"]; require["dotenv"] .config[]; const mongouri = 'mongodb+srv://User1:' + process.env.MONGO_PASS + '@cluster0.wakey.mongodb.net/myFirstDatabase?retryWrites=true&w=majority'; try { mongoose.connect[mongouri, { useUnifiedTopology: true, useNewUrlParser: true }]; } catch [error] { handleError[error]; } process.on['unhandledRejection', error => { console.log['unhandledRejection', error.message]; }]; //creating bucket let bucket; mongoose.connection.on["connected", [] => { var db = mongoose.connections[0].db; bucket = new mongoose.mongo.GridFSBucket[db, { bucketName: "newBucket" }]; console.log[bucket]; }]; //to parse json content app.use[express.json[]]; //to parse body from url app.use[express.urlencoded[{ extended: false }]]; app.listen[process.env.PORT, function [] { console.log[`Application live on localhost:{process.env.PORT}`]; }];
Ở đây chúng tôi đang thiết lập máy chủ MongoDB với Mongoose, sau đó chúng tôi đang tạo nhóm khi chúng tôi có được kết nối với MongoDB Atlas, với chức năng
1 2 3 4 5 6 7 8
let bucket; mongoose.connection.on["connected", [] => { var db = mongoose.connections[0].db; bucket = new mongoose.mongo.GridFSBucket[db, { bucketName: "newBucket" }]; console.log[bucket]; }];
Chúng ta cũng đã chuyển biến bucketName với giá trị newBucket, do đó nhóm của chúng ta sẽ được tạo với tên newBucket. Ghi chú. nếu bạn không truyền bucketName thì MongoDB sẽ đặt cho nó tên mặc định là fs
Hãy thiết lập mô-đun multer-gridfs, liên kết nó với GridFS của chúng ta, sau đó sử dụng nó trong điểm cuối /upload để tải tệp lên gridfs
Thêm mã điểm cuối vào ứng dụng. js như sau
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
const express = require["express"]; const app = express[]; const mongoose = require["mongoose"]; const multer = require["multer"]; const { GridFsStorage } = require["multer-gridfs-storage"]; var crypto = require['crypto']; var path = require['path']; require["dotenv"] .config[]; const mongouri = 'mongodb+srv://User1:' + process.env.MONGO_PASS + '@cluster0.wakey.mongodb.net/myFirstDatabase?retryWrites=true&w=majority'; try { mongoose.connect[mongouri, { useUnifiedTopology: true, useNewUrlParser: true }]; } catch [error] { handleError[error]; } process.on['unhandledRejection', error => { console.log['unhandledRejection', error.message]; }]; //creating bucket let bucket; mongoose.connection.on["connected", [] => { var client = mongoose.connections[0].client; var db = mongoose.connections[0].db; bucket = new mongoose.mongo.GridFSBucket[db, { bucketName: "newBucket" }]; console.log[bucket]; }]; app.use[express.json[]]; app.use[express.urlencoded[{ extended: false }]]; const storage = new GridFsStorage[{ url: mongouri, file: [req, file] => { return new Promise[[resolve, reject] => { const filename = file.originalname; const fileInfo = { filename: filename, bucketName: "newBucket" }; resolve[fileInfo]; }]; } }]; const upload = multer[{ storage }]; app.post["/upload", upload.single["file"], [req, res] => { res.status[200] .send["File uploaded successfully"]; }]; const PORT = process.env.PORT || 8080; app.listen[PORT, [] => { console.log[`Application live on localhost:{process.env.PORT}`]; }];
Ở đây chúng tôi đang sử dụng chức năng GridFsStorage trong mô-đun multer-gridfs-storage để kết nối với bộ lưu trữ GridFS. Sau đó, chúng tôi sẽ chỉ định bộ nhớ đó cho tải lên biến, sau đó sử dụng tải lên đó làm phần mềm trung gian trong điểm cuối /upload mà chúng tôi sẽ sử dụng để lắng nghe các yêu cầu đăng bao gồm các tệp sẽ được tải lên
Hãy kiểm tra điểm cuối này trong Postman.
Kích hoạt Postman và tạo một yêu cầu POST để /tải lên một tệp.
Bạn sẽ nhận được đầu ra cho yêu cầu trên dưới dạng
Bây giờ, hãy tạo một điểm cuối để truy xuất thông tin tệp và tải tệp xuống.
Viết mã trong ứng dụng. js như sau.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
const express = require["express"]; const app = express[]; const mongoose = require["mongoose"]; const multer = require["multer"]; const { GridFsStorage } = require["multer-gridfs-storage"]; require["dotenv"] .config[]; const mongouri = 'mongodb+srv://User1:' + process.env.MONGO_PASS + '@cluster0.wakey.mongodb.net/myFirstDatabase?retryWrites=true&w=majority'; try { mongoose.connect[mongouri, { useUnifiedTopology: true, useNewUrlParser: true }]; } catch [error] { handleError[error]; } process.on['unhandledRejection', error => { console.log['unhandledRejection', error.message]; }]; //creating bucket let bucket; mongoose.connection.on["connected", [] => { var client = mongoose.connections[0].client; var db = mongoose.connections[0].db; bucket = new mongoose.mongo.GridFSBucket[db, { bucketName: "newBucket" }]; console.log[bucket]; }]; app.use[express.json[]]; app.use[express.urlencoded[{ extended: false }]]; const storage = new GridFsStorage[{ url: mongouri, file: [req, file] => { return new Promise[[resolve, reject] => { const filename = file.originalname; const fileInfo = { filename: filename, bucketName: "newBucket" }; resolve[fileInfo]; }]; } }]; const upload = multer[{ storage }]; app.get["/fileinfo/:filename", [req, res] => { const file = bucket .find[{ filename: req.params.filename }] .toArray[[err, files] => { if [!files || files.length === 0] { return res.status[404] .json[{ err: "no files exist" }]; } bucket.openDownloadStreamByName[req.params.filename] .pipe[res]; }]; }]; app.post["/upload", upload.single["file"], [req, res] => { res.status[200] .send["File uploaded successfully"]; }]; const PORT = process.env.PORT || 8080; app.listen[PORT, [] => { console.log[`Application live on localhost:{process.env.PORT}`]; }];
Ở đây chúng tôi đã tạo điểm cuối /fileinfo/. filename để tìm kiếm một tập tin và tải xuống nếu nó tồn tại trong cơ sở dữ liệu. Chúng tôi đang chuyển tên tệp dưới dạng tham số cho đường dẫn và sau đó chúng tôi đang sử dụng nhóm. tìm để tìm xem tệp có tồn tại trong cơ sở dữ liệu không. Nếu nó tồn tại, chúng tôi tạo một luồng tải xuống và định hướng nó để phản hồi;
Hãy kiểm tra điểm cuối này bằng cách thu thập thông tin về tệp chúng tôi đã lưu trữ ở bước trước, bằng cách tạo yêu cầu GET trong Postman dưới dạng
Và bạn phải nhận được đầu ra như sau
Hiển thị bản pdf đã tải xuống.
Tương tự, việc đổi tên tệp có thể được thực hiện bằng cách gọi.
bucket.rename[ObjectId["616ef2f1062f0a454f0379b6"], "newFileName"];
Xóa một tập tin có thể được thực hiện tương tự bằng cách
Và chúng ta cũng có thể thả một thùng bằng cách chạy
________số 8
Đó là cách bạn có thể triển khai GridFS trong ứng dụng nút/nhanh của mình
Hạn chế của GrifdFS
Mặc dù GridFS là một công cụ tuyệt vời nhưng nó vẫn có một số hạn chế
Xử lý một tệp tại một thời điểm
Cung cấp tệp dọc theo tập dữ liệu có thể ảnh hưởng đến hiệu suất của cơ sở dữ liệu. Tốt hơn hết là sử dụng máy chủ MongoDB riêng để lưu trữ tệp
GridFS không cung cấp cách thực hiện cập nhật tự động tệp. Vì vậy, bạn phải tự triển khai lập phiên bản và quản lý nó
Làm cách nào để lưu trữ dữ liệu tệp trong MongoDB?
Trong MongoDB, sử dụng GridFS để lưu trữ tệp lớn hơn 16 MB . Trong một số trường hợp, việc lưu trữ các tệp lớn trong cơ sở dữ liệu MongoDB có thể hiệu quả hơn trên hệ thống tệp cấp hệ thống. Nếu hệ thống tệp của bạn giới hạn số lượng tệp trong một thư mục, bạn có thể sử dụng GridFS để lưu trữ bao nhiêu tệp tùy ý.Các tệp MongoDB được lưu trữ ở đâu?
MongoDB lưu trữ dữ liệu và chỉ mục trên đĩa ở định dạng nhị phân được nén.MongoDB có cung cấp dung lượng lưu trữ không?
MongoDB cung cấp nhiều công cụ lưu trữ , cho phép bạn chọn một công cụ phù hợp nhất với ứng dụng của mình. Nhật ký là nhật ký giúp cơ sở dữ liệu phục hồi trong trường hợp tắt máy nghiêm trọng.Lưu trữ MongoDB là gì?
MongoDB lưu trữ các đối tượng dữ liệu trong các bộ sưu tập và tài liệu thay vì các bảng và hàng được sử dụng trong cơ sở dữ liệu quan hệ truyền thống . Bộ sưu tập bao gồm các bộ tài liệu, tương đương với các bảng trong cơ sở dữ liệu quan hệ. Tài liệu bao gồm các cặp khóa-giá trị, là đơn vị dữ liệu cơ bản trong MongoDB.