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

Bagaimana cara menyimpan file JSON menggunakan GridFs

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!'))
  ;
});


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB menyimpan array ObjectId's

  2. Node.JS menunggu variabel disetel

  3. Bagaimana cara menggunakan agregat MongoDB untuk mendapatkan yang pertama dari setiap grup, termasuk nol?

  4. Cara mengkloning/menyalin database di Azure Cosmos DB

  5. ConfigurationError:Server di 127.0.0.1:27017 melaporkan versi wire 0, tetapi versi PyMongo ini membutuhkan setidaknya 2 (MongoDB 2.6)