Bardzo prawdopodobne jest, że nie warto przechowywać danych w Mongo przy użyciu GridFS.
Dane binarne nigdy tak naprawdę nie należą do bazy danych, ale jeśli dane są małe, korzyści z umieszczenia ich w bazie danych (możliwość wykonywania zapytań) przewyższają wady (obciążenie serwera, powolność).
W takim przypadku wygląda na to, że chcesz przechowywać dane dokumentu (JSON) w GridFS. Możesz to zrobić i przechowywać je tak, jak inne dane binarne. Dane będą jednak nieprzejrzyste. Nie można wyszukiwać danych JSON przechowywanych w dokumencie GridFS, tylko metadanych pliku.
Pytania o duże zbiory danych
Jak wspomniałeś, że chcesz przeszukać dane, powinieneś sprawdzić format swoich danych. Jeśli Twoje dane są w formacie podanym w przykładzie, wygląda na to, że nie ma potrzeby wykonywania skomplikowanych zapytań, a jedynie dopasowywania ciągów. Jest więc kilka opcji.
Przypadek 1:duża ilość danych, mało punktów
Jeśli nie masz wielu zestawów danych (pary field1
i field2
), ale dane dla każdego z nich są duże (field2
zawiera wiele bajtów), przechowuj je w innym miejscu i przechowuj tylko odniesienie do tego. Prostym rozwiązaniem byłoby przechowywanie danych (dawniej field2
) w pliku tekstowym w Amazon S3 i zapisz, a następnie zapisz link. np.
{
field1: “>HWI-ST700660_96:2:1101:1455:2154#[email protected]/1”,
field2link: "https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png"
}
Przypadek 2:Małe dane, wiele punktów
Jeśli każdy zestaw danych jest mały (mniej niż 16 MB), ale jest wiele zestawów danych, przechowuj swoje dane w MongoDB (bez GridFS).
Szczegóły
W twoim przypadku dane są dość duże i przechowywanie ich za pomocą GridFS jest niewskazane.
Ta odpowiedź stanowi punkt odniesienia w kierunku dna. Wzorzec wydaje się wskazywać, że czas pobierania jest mniej więcej wprost proporcjonalny do rozmiaru pliku. Przy tej samej konfiguracji pobranie dokumentu z bazy danych zajęłoby 80 sekund.
Możliwe optymalizacje
Domyślny rozmiar porcji w GridFS to 255 KiB. Możesz skrócić czas dostępu do dużych plików, zwiększając rozmiar porcji do maksimum (16 MB). Jeśli rozmiar fragmentu jest jedynym wąskim gardłem, użycie rozmiaru fragmentu 16 MB skróci czas pobierania z 80 sekund do 1,3 sekundy (80 / (16 MB/255KiB) =1,3). Możesz to zrobić podczas inicjowania zasobnika GridFS.
new GridFSBucket(db, {chunkSizeBytes: 16000000})
Lepszą strategią byłoby przechowywanie jedynej nazwy pliku w Mongo i pobieranie pliku z systemu plików.
Inne wady
Inną możliwą wadą przechowywania danych binarnych w Mongo jest ta strona :"Jeśli dane binarne są duże, załadowanie danych binarnych do pamięci może spowodować wypchnięcie często używanych dokumentów tekstowych (danych strukturalnych) z pamięci lub, ogólniej, zestaw roboczy może nie zmieścić się w pamięci RAM. Może to mieć negatywny wpływ wydajność bazy danych." [1 ]
Przykład
Zapisywanie pliku w GridFS, na podstawie samouczka 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!'))
;
});