Molto probabilmente non vale la pena archiviare i dati in Mongo usando GridFS.
I dati binari non appartengono mai realmente a un database, ma se i dati sono piccoli, i vantaggi di inserirli nel database (capacità di eseguire query) superano gli svantaggi (carico del server, lento).
In questo caso, sembra che desideri archiviare i dati del documento (JSON) in GridFS. Puoi farlo e memorizzarlo nel modo in cui memorizzeresti qualsiasi altro dato binario. I dati, tuttavia, saranno opachi. Non puoi eseguire query sui dati JSON archiviati in un documento GridFS, solo sui metadati del file.
Interrogazione di big data
Come hai detto che volevi interrogare i dati, dovresti controllare il formato dei tuoi dati. Se i tuoi dati sono nel formato elencato nell'esempio, sembra che non siano necessarie query complicate, solo la corrispondenza di stringhe. Quindi ci sono diverse opzioni.
Caso 1:dati di grandi dimensioni, pochi punti
Se non hai molti set di dati (coppie di field1
e field2
) ma i dati per ciascuno sono grandi (field2
contiene molti byte), archiviarli altrove e archiviare solo un riferimento a quello. Una soluzione semplice sarebbe quella di memorizzare i dati (precedentemente field2
) in un file di testo su Amazon S3 e archiviare quindi archiviare il collegamento. es.
{
field1: “>HWI-ST700660_96:2:1101:1455:2154#[email protected]/1”,
field2link: "https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png"
}
Caso 2:piccoli dati, molti punti
Se ogni tuo set di dati è piccolo (meno di 16 MB) ma ci sono molti set di dati, archivia i tuoi dati in MongoDB (senza GridFS).
Specifiche
Nel tuo caso, i dati sono piuttosto grandi e archiviarli utilizzando GridFS è sconsigliabile.
Questa risposta fornisce un punto di riferimento verso il basso. Il benchmark sembra indicare che il tempo di recupero è più o meno direttamente proporzionale alla dimensione del file. Con la stessa configurazione, ci vorrebbero 80 secondi per recuperare un documento dal database.
Possibili ottimizzazioni
La dimensione del blocco predefinita in GridFS è 255 KiB. Potresti essere in grado di ridurre i tempi di accesso a file di grandi dimensioni aumentando la dimensione del blocco al massimo (16 MB). Se la dimensione del blocco è l'unico collo di bottiglia, l'utilizzo della dimensione del blocco di 16 MB ridurrebbe il tempo di recupero da 80 secondi a 1,3 secondi (80 / (16 MB/255 KiB) =1,3). Puoi farlo durante l'inizializzazione del bucket GridFS.
new GridFSBucket(db, {chunkSizeBytes: 16000000})
Una strategia migliore sarebbe quella di memorizzare l'unico nome di file in Mongo e recuperare invece il file dal filesystem.
Altri inconvenienti
Un altro possibile inconveniente della memorizzazione dei dati binari in Mongo deriva da questo sito :"Se i dati binari sono di grandi dimensioni, il caricamento dei dati binari in memoria può causare l'espulsione dalla memoria dei documenti di testo (dati strutturati) a cui si accede di frequente o, più in generale, il working set potrebbe non adattarsi alla RAM. Ciò può avere un impatto negativo le prestazioni del database." [1 ]
Esempio
Salvataggio di un file in GridFS, adattato dal 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!'))
;
});