Rất có thể không đáng để lưu trữ dữ liệu trong Mongo bằng GridFS.
Dữ liệu nhị phân không bao giờ thực sự thuộc về cơ sở dữ liệu, nhưng nếu dữ liệu nhỏ, lợi ích của việc đưa nó vào cơ sở dữ liệu (khả năng truy vấn) lớn hơn nhược điểm (tải máy chủ, chậm).
Trong trường hợp này, có vẻ như bạn muốn lưu trữ dữ liệu tài liệu (JSON) trong GridFS. Bạn có thể làm điều này và lưu trữ nó theo cách bạn sẽ lưu trữ bất kỳ dữ liệu nhị phân nào khác. Tuy nhiên, dữ liệu sẽ không rõ ràng. Bạn không thể truy vấn dữ liệu JSON được lưu trữ trong tài liệu GridFS, chỉ siêu dữ liệu tệp.
Truy vấn dữ liệu lớn
Như bạn đã đề cập rằng bạn muốn truy vấn dữ liệu, bạn nên kiểm tra định dạng dữ liệu của mình. Nếu dữ liệu của bạn ở định dạng được liệt kê trong ví dụ, thì có vẻ như không cần truy vấn phức tạp, chỉ cần đối sánh chuỗi. Vì vậy, có một số tùy chọn.
Trường hợp 1:Dữ liệu lớn, ít điểm
Nếu bạn không có nhiều tập dữ liệu (cặp field1
và field2
) nhưng dữ liệu cho mỗi dữ liệu lớn (field2
chứa nhiều byte), lưu trữ chúng ở nơi khác và chỉ lưu trữ một tham chiếu đến đó. Một giải pháp đơn giản là lưu trữ dữ liệu (trước đây là field2
) trong một tệp văn bản trên Amazon S3 và lưu trữ sau đó lưu trữ liên kết. ví dụ:
{
field1: “>HWI-ST700660_96:2:1101:1455:2154#[email protected]/1”,
field2link: "https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png"
}
Trường hợp 2:Dữ liệu nhỏ, nhiều điểm
Nếu mỗi tập dữ liệu của bạn nhỏ (dưới 16 MB) nhưng có nhiều tập dữ liệu, hãy lưu trữ dữ liệu của bạn trong MongoDB (không có GridFS).
Chi tiết cụ thể
Trong trường hợp của bạn, dữ liệu khá lớn và việc lưu trữ nó bằng GridFS là không thể sử dụng được.
Câu trả lời này cung cấp một điểm chuẩn hướng tới đáy. Điểm chuẩn dường như chỉ ra rằng thời gian truy xuất ít nhiều tỷ lệ thuận với kích thước tệp. Với cùng một thiết lập, sẽ mất 80 giây để lấy một tài liệu từ cơ sở dữ liệu.
Các tối ưu có thể có
Kích thước chunk mặc định trong GridFS là 255 KiB. Bạn có thể giảm thời gian truy cập tệp lớn bằng cách tăng kích thước chunk lên tối đa (16 MB). Nếu kích thước chunk là nút cổ chai duy nhất, thì việc sử dụng kích thước chunk 16 MB sẽ giảm thời gian truy xuất từ 80 giây xuống 1,3 giây (80 / (16MB / 255KiB) =1,3). Bạn có thể thực hiện việc này khi khởi tạo nhóm GridFS.
new GridFSBucket(db, {chunkSizeBytes: 16000000})
Một chiến lược tốt hơn sẽ là lưu trữ tên tệp duy nhất trong Mongo và truy xuất tệp từ hệ thống tệp thay thế.
Các nhược điểm khác
Một nhược điểm khác có thể xảy ra khi lưu trữ dữ liệu nhị phân trong Mongo đến từ trang web này :"Nếu dữ liệu nhị phân lớn, thì việc tải dữ liệu nhị phân vào bộ nhớ có thể khiến các tài liệu văn bản (dữ liệu có cấu trúc) được truy cập thường xuyên bị đẩy ra khỏi bộ nhớ hoặc nói chung là tập hợp hoạt động có thể không vừa với RAM. Điều này có thể tác động tiêu cực hiệu suất của cơ sở dữ liệu. " [ 1 ]
Ví dụ
Lưu tệp trong GridFS, được điều chỉnh từ hướng dẫn của Mongo GridFS
const uri = 'mongodb://localhost:27017/test';
mongodb.MongoClient.connect(uri, (error, db) => {
const bucket = new mongodb.GridFSBucket(db);
fs.createReadStream('./fasta-data.json')
.pipe(bucket.openUploadStream('fasta-data.json'))
.on('finish', () => console.log('done!'))
;
});