Sangat mungkin tidak layak menyimpan data di Mongo menggunakan GridFS.
Data biner tidak pernah benar-benar termasuk dalam database, tetapi jika datanya kecil, manfaat dari memasukkannya ke dalam database (kemampuan untuk melakukan kueri) lebih besar daripada kerugiannya (beban server, lambat).
Dalam hal ini, sepertinya Anda ingin menyimpan data dokumen (JSON) di GridFS. Anda dapat melakukan ini, dan menyimpannya seperti Anda menyimpan data biner lainnya. Namun, datanya akan buram. Anda tidak dapat menanyakan data JSON yang disimpan dalam dokumen GridFS, hanya metadata file.
Meminta data besar
Seperti yang Anda sebutkan bahwa Anda ingin meminta data, Anda harus memeriksa format data Anda. Jika data Anda dalam format yang tercantum dalam contoh, maka sepertinya tidak perlu kueri yang rumit, hanya pencocokan string. Jadi ada beberapa opsi.
Kasus 1:Data Besar, Sedikit Poin
Jika Anda tidak memiliki banyak kumpulan data (pasangan field1
dan field2
) tetapi data untuk masing-masing besar (field2
berisi banyak byte), simpan ini di tempat lain dan simpan hanya referensi untuk itu. Solusi sederhana adalah dengan menyimpan data (sebelumnya field2
) dalam file teks di Amazon S3 dan simpan lalu simpan tautannya. misalnya
{
field1: “>HWI-ST700660_96:2:1101:1455:2154#[email protected]/1”,
field2link: "https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png"
}
Kasus 2:Data Kecil, Banyak Poin
Jika setiap kumpulan data Anda kecil (kurang dari 16 MB) tetapi ada banyak kumpulan data, simpan data Anda di MongoDB (tanpa GridFS).
Spesifikasi
Dalam kasus Anda, datanya cukup besar dan menyimpannya menggunakan GridFS tidak disarankan.
Jawaban ini memberikan patokan menuju ke bawah. Benchmark tampaknya menunjukkan bahwa waktu pengambilan kurang lebih berbanding lurus dengan ukuran file. Dengan pengaturan yang sama, dibutuhkan 80 detik untuk mengambil dokumen dari database.
Pengoptimalan yang memungkinkan
Ukuran chunk default di GridFS adalah 255 KiB. Anda mungkin dapat mengurangi waktu akses file yang besar dengan meningkatkan ukuran potongan hingga maksimum (16 MB). Jika ukuran potongan adalah satu-satunya hambatan, maka menggunakan ukuran potongan 16 MB akan mengurangi waktu pengambilan dari 80 detik menjadi 1,3 detik (80 / (16MB/255KiB) =1,3). Anda dapat melakukan ini saat menginisialisasi bucket GridFS.
new GridFSBucket(db, {chunkSizeBytes: 16000000})
Strategi yang lebih baik adalah menyimpan satu-satunya nama file di Mongo dan mengambil file dari sistem file sebagai gantinya.
Kekurangan lainnya
Kelemahan lain yang mungkin dari menyimpan data biner di Mongo berasal dari situs ini :"Jika data biner besar, maka memuat data biner ke dalam memori dapat menyebabkan dokumen teks (data terstruktur) yang sering diakses terdorong keluar dari memori, atau lebih umum, perangkat kerja mungkin tidak muat ke dalam RAM. Ini dapat berdampak negatif kinerja basis data." [1 ]
Contoh
Menyimpan file di GridFS, diadaptasi dari tutorial 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!'))
;
});