MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Menyimpan File di MongoDB dengan GridFS

Banyak aplikasi melibatkan manajemen file dan memiliki penyimpanan file sebagai fitur penting untuk meningkatkan pemrosesan data. Penyimpanan file sering kali memerlukan CDN (Content Delivery Network) pihak ketiga, seperti layanan Web Amazon, tetapi ini membuat proses manajemen sedikit membosankan. Akan lebih mudah untuk mengakses semua sumber daya Anda dari satu penyimpanan cloud, daripada beberapa, karena mungkin ada kemungkinan kegagalan selama pengambilan.

Menyimpan file langsung ke database melalui satu panggilan API bukanlah sesuatu yang mudah dilakukan sampai GridFS diperkenalkan di MongoDB.

Apa itu MongoDB GridFS

GridFs adalah lapisan abstraksi di MongoDB yang digunakan dalam penyimpanan dan pemulihan file besar seperti video, audio, dan gambar. Sistem file ini menyimpan file yang bahkan lebih signifikan dari 16 MB dalam kumpulan data MongoDB. File disimpan dengan  terlebih dahulu memecahnya menjadi potongan data yang lebih kecil, masing-masing bagian berukuran 255 KB.

GridFS menggunakan dua sistem pengumpulan untuk menyimpan file:

  1. Potongan :Ini adalah koleksi yang menyimpan bagian-bagian dokumen. Potongan terbatas pada ukuran masing-masing 255KB dan ketika seseorang membuat kueri, driver GridFS merakit kembali semua potongan sesuai _id unik penyimpanan. Misalnya, Anda ingin mengambil segmen file video daripada seluruh file, ini dimungkinkan hanya dengan menanyakan rentang yang benar yang Anda inginkan.
  2. File :Ini menyimpan metadata tambahan untuk file tersebut.

Koleksi ditempatkan di ember umum dan kemudian awali masing-masing dengan nama ember yang secara default adalah fs sehingga kita memiliki:

  • fs.chunks
  • fs.files

Seseorang dapat memilih nama bucket yang berbeda tetapi nama koleksi lengkap tunduk pada:batas ruang nama 255 byte.

Koleksi Potongan

Dokumen kumpulan potongan berbentuk: 

{

  "_id" : <ObjectId>,

  "files_id" : <ObjectId>,

  "n" : <num>,

  "data" : <binary>

}

Di mana:

  • _id:adalah pengidentifikasi unik untuk chunk
  • files_id:adalah _id dari dokumen induk yang disimpan dalam koleksi file
  • n:adalah nomor urut potongan yang dimulai dengan 0.
  • data:adalah muatan chunk sebagai tipe Biner BSON.

Indeks gabungan menggunakan files_id dan n bidang digunakan untuk memungkinkan pengambilan potongan yang efisien misalnya:

db.fs.chunks.find( { files_id: fileId } ).sort( { n: 1 } )

Untuk membuat indeks ini jika tidak ada, Anda dapat menjalankan perintah berikut pada shell mongo:

db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } );

Koleksi File

Dokumen dalam koleksi ini berbentuk

{

  "_id" : <ObjectId>,

  "length" : <num>,

  "chunkSize" : <num>,

  "uploadDate" : <timestamp>,

  "filename" : <string>,

  "metadata" : <any>,

}

Di mana:

  •  _id:adalah pengidentifikasi unik untuk dokumen yang merupakan tipe data yang dipilih untuk dokumen asli dan secara default di MongoDB adalah BSON ObjectId.
  • panjang:adalah ukuran dokumen dalam byte
  • chunkSize:ukuran setiap chunk yang dibatasi hingga 255 kilobyte
  • uploadDate:bidang tipe Date yang menyimpan tanggal dokumen pertama kali disimpan.
  • nama file:ini adalah bidang opsional yang merupakan identifikasi yang dapat dibaca manusia untuk file tersebut.
  • metadata:ini adalah bidang opsional yang menyimpan informasi tambahan yang ingin disimpan.

Contoh file fs ditunjukkan di bawah ini.

{

   "filename": "file.html",

   "chunkSize": NumberInt(23980),

   "uploadDate": ISODate("2020-08-11T10:02:15.237Z"),

   "length": NumberInt(312)

}

Seperti kumpulan potongan, indeks gabungan menggunakan bidang nama file dan tanggal upload digunakan dalam kumpulan file untuk memungkinkan pengambilan file yang efisien, misalnya:

db.fs.files.find( { filename: fileName } ).sort( { uploadDate: 1 } )

Untuk membuat indeks ini jika tidak ada, Anda dapat menjalankan perintah berikut pada shell mongo:

db.fs.file.createIndex( { filename: 1, uploadDate: 1 }, { unique: true } );

Kapan Menggunakan Sistem Penyimpanan GridFS MongoDB

MongoDB GridFS tidak umum digunakan tetapi  berikut adalah kondisi yang mungkin mengharuskan penggunaan sistem penyimpanan GridFS ini;

  •  Saat sistem file saat ini memiliki batasan jumlah file yang dapat disimpan dalam direktori tertentu.
  •  Saat seseorang ingin mengakses sebagian dari informasi yang disimpan, GridFS memungkinkan seseorang untuk memanggil kembali sebagian file tanpa mengakses seluruh dokumen.
  • Bila seseorang bermaksud untuk mendistribusikan file dan metadatanya melalui kumpulan replika yang didistribusikan secara geografis, GridFS memungkinkan metadata untuk menyinkronkan dan menyebarkan data di beberapa sistem yang ditargetkan secara otomatis.

Kapan Tidak Menggunakan Sistem Penyimpanan MongoDB GridFS

Namun, sistem penyimpanan GridFS tidak sesuai untuk digunakan ketika akan ada kebutuhan untuk memperbarui konten seluruh file yang disimpan di GridFS.

Cara Menambahkan File ke GridFS

Saat menyimpan file mp3 di MongoDB menggunakan GridFs,  prosedur yang benar untuk diikuti adalah ini;

  1. Buka terminal (Prompt perintah)
  2. Navigasi ke mongfiles.exe (ini terletak di folder bin)
  3. Gunakan perintah 
    >mongofiles.exe -d gridfs put song.mp3

Setelah perintah, nama database yang akan digunakan adalah gridfs, jika kebetulan nama tersebut hilang, MongoDB secara otomatis membuat dokumen yang menyimpan file tersebut di database.

Untuk melihat file yang disimpan di GridFS gunakan perintah query di bawah ini pada shell mongo;

>db.fs.files.find()

Perintah mengembalikan dokumen dengan format seperti di bawah ini:

{

   _id: ObjectId('526a922bf8b4aa4d33fdf84d'),

   filename: "song.mp3",

   chunkSize: 233390,

   uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41",

   length: 10302960

}

File memiliki detail berikut, nama file,  panjang, tanggal upload, ukuran potongan,  dan object_id. Potongan dalam koleksi fs.chunks dapat dilihat menggunakan id yang dikembalikan dalam kueri awal seperti yang ditunjukkan di bawah ini.

>db.fs.chunks.find({files_id:ObjectId('526a922bf8b4aa4d33fdf84d')})

Sharding GridFS

Sharding juga merupakan fitur lain yang berlaku dengan GridFS. Untuk shard chunks collection, seseorang dapat menggunakan indeks gabungan dari { files_id :1, n :1 } atau { files_id :1 } sebagai kunci shard.

Harshed Sharding hanya dimungkinkan jika driver MongoDB tidak menjalankan filemd5.

Koleksi file sering kali tidak di-sharding karena hanya berisi metadata dan  sangat kecil. Kunci yang tersedia juga tidak memberikan distribusi yang merata dalam kluster yang di-sharded. Namun, jika seseorang perlu melakukan sharding terhadap kumpulan file, Anda dapat menggunakan bidang _id dalam kombinasi dengan beberapa bidang aplikasi.

Keterbatasan GridFS

Sistem File GridFS memiliki batasan sebagai berikut:

  1. Pembaruan atom: GridFS tidak memiliki pembaruan atom. Ini mempermudah pembaruan secara manual dengan memilih versi file yang diperlukan dan menjalankan beberapa versi file
  2. Kinerja :  sistem cenderung lambat dengan sistem file dan server web.
  3. Set kerja: satu menggunakan server lain ketika bekerja pada set kerja baru. Hal ini dilakukan agar tidak mengganggu set kerja yang sedang berjalan.

Kesimpulan

GridFS seperti peluru perak untuk pengembang yang berniat untuk menyimpan file besar di MongoDB. Sistem penyimpanan GridFS memberi pengembang kesempatan untuk menyimpan file besar dan mengambil bagian dari file yang dibutuhkan. Oleh karena itu, GridFS adalah fitur MongoDB yang luar biasa yang dapat digunakan dengan berbagai aplikasi.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB Node memeriksa apakah objectid valid

  2. Metode meteor vs. aturan tolak/izinkan

  3. Hitung rata-rata bidang dalam dokumen/array yang disematkan

  4. Menyimpan dan mengambil objek JavaScript di/dari MongoDB

  5. bagaimana cara melepaskan caching yang digunakan oleh Mongodb?