Много вероятно не си струва да съхранявате данните в Mongo с помощта на GridFS.
Двоичните данни никога не принадлежат към база данни, но ако данните са малки, ползите от поставянето им в базата данни (възможност за заявки) надвишават недостатъците (натоварване на сървъра, бавно).
В този случай изглежда, че искате да съхранявате данни за документи (JSON) в GridFS. Можете да направите това и да го съхраните по начина, по който бихте съхранили всички други двоични данни. Данните обаче ще бъдат непрозрачни. Не можете да правите заявки за JSON данни, съхранявани в GridFS документ, а само за метаданните на файла.
Запитване за големи данни
Тъй като споменахте, че искате да направите заявка за данните, трябва да проверите формата на вашите данни. Ако вашите данни са във формата, посочен в примера, тогава изглежда, че няма нужда от сложни заявки, а само съвпадение на низове. Така че има няколко опции.
Случай 1:Големи данни, малко точки
Ако нямате много набори от данни (двойки от field1
и field2
), но данните за всеки от тях са големи (field2
съдържа много байтове), съхранявайте ги другаде и съхранявайте само препратка към това. Едно просто решение би било да съхранявате данните (по-рано field2
) в текстов файл на Amazon S3 и запазете след това съхранете връзката. напр.
{
field1: “>HWI-ST700660_96:2:1101:1455:2154#[email protected]/1”,
field2link: "https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png"
}
Случай 2:Малки данни, много точки
Ако всеки ваш набор от данни е малък (по-малко от 16 MB), но има много набори от данни, съхранявайте данните си в MongoDB (без GridFS).
Специфични данни
Във вашия случай данните са доста големи и съхраняването им с помощта на GridFS е непрепоръчително.
Този отговор осигурява еталон към дъното. Бенчмаркът изглежда показва, че времето за извличане е повече или по-малко пряко пропорционално на размера на файла. При същата настройка извличането на документ от базата данни ще отнеме 80 секунди.
Възможни оптимизации
Размерът на парчето по подразбиране в GridFS е 255 KiB. Може да успеете да намалите времето за достъп до големи файлове, като увеличите размера на парчето до максимум (16 MB). Ако размерът на парчето е единственото тясно място, тогава използването на размер на парчето от 16 MB ще намали времето за извличане от 80 секунди на 1,3 секунди (80 / (16MB/255KiB) =1,3). Можете да направите това, когато инициализирате кофата GridFS.
new GridFSBucket(db, {chunkSizeBytes: 16000000})
По-добра стратегия би била да съхраните единственото име на файл в Mongo и вместо това да извлечете файла от файловата система.
Други недостатъци
Друг възможен недостатък на съхраняването на двоичните данни в Mongo идва от този сайт :"Ако двоичните данни са големи, тогава зареждането на двоичните данни в паметта може да доведе до изтласкване на често достъпни текстови (структурирани данни) документи извън паметта или по-общо работният набор може да не се побере в RAM. Това може да повлияе отрицателно производителността на базата данни." [1 ]
Пример
Запазване на файл в GridFS, адаптирано от урока за 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!'))
;
});