Lưu trữ tệp MongoDB

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

  1. Tệp - (cái này lưu trữ siêu dữ liệu tệp)

  2. 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.

Lưu trữ tệp MongoDB

Bạn sẽ nhận được đầu ra cho yêu cầu trên dưới dạng

Lưu trữ tệp MongoDB

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

Lưu trữ tệp MongoDB

Và bạn phải nhận được đầu ra như sau

Lưu trữ tệp MongoDB

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.