sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo guardar un archivo JSON usando GridFs

Es muy probable que no valga la pena almacenar los datos en Mongo usando GridFS.

Los datos binarios nunca pertenecen realmente a una base de datos, pero si los datos son pequeños, los beneficios de colocarlos en la base de datos (capacidad de consulta) superan los inconvenientes (carga del servidor, lentitud).

En este caso, parece que le gustaría almacenar datos de documentos (JSON) en GridFS. Puede hacer esto y almacenarlo de la misma forma que almacenaría cualquier otro dato binario. Los datos, sin embargo, serán opacos. No puede consultar los datos JSON almacenados en un documento GridFS, solo los metadatos del archivo.

Consulta de grandes datos

Como mencionó que quería consultar los datos, debe verificar el formato de sus datos. Si sus datos están en el formato que se muestra en el ejemplo, entonces parece que no hay necesidad de consultas complicadas, solo coincidencia de cadenas. Así que hay varias opciones.

Caso 1:Gran cantidad de datos, pocos puntos

Si no tiene muchos conjuntos de datos (pares de field1 y field2 ) pero los datos para cada uno son grandes (field2 contiene muchos bytes), guárdelos en otro lugar y almacene solo una referencia a eso. Una solución simple sería almacenar los datos (anteriormente field2 ) en un archivo de texto en Amazon S3 y almacene y luego almacene el enlace. por ejemplo

{
  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:Datos pequeños, muchos puntos

Si cada conjunto de datos es pequeño (menos de 16 MB) pero hay muchos conjuntos de datos, almacene sus datos en MongoDB (sin GridFS).

Específicos

En su caso, los datos son bastante grandes y no es recomendable almacenarlos usando GridFS.

Esta respuesta proporciona un punto de referencia hacia abajo. El punto de referencia parece indicar que el tiempo de recuperación es más o menos directamente proporcional al tamaño del archivo. Con la misma configuración, tomaría 80 segundos recuperar un documento de la base de datos.

Posibles optimizaciones

El tamaño de fragmento predeterminado en GridFS es 255 KiB. Es posible que pueda reducir los tiempos de acceso a archivos grandes aumentando el tamaño del fragmento al máximo (16 MB). Si el tamaño del fragmento es el único cuello de botella, el uso del tamaño del fragmento de 16 MB reduciría el tiempo de recuperación de 80 segundos a 1,3 segundos (80 / (16 MB/255 KiB) =1,3). Puede hacer esto al inicializar el depósito de GridFS.

new GridFSBucket(db, {chunkSizeBytes: 16000000})

Una mejor estrategia sería almacenar el único nombre de archivo en Mongo y recuperar el archivo del sistema de archivos en su lugar.

Otros inconvenientes

Otro posible inconveniente de almacenar los datos binarios en Mongo proviene de este sitio :"Si los datos binarios son grandes, cargar los datos binarios en la memoria puede hacer que los documentos de texto (datos estructurados) a los que se accede con frecuencia se extraigan de la memoria o, de manera más general, el conjunto de trabajo podría no caber en la RAM. Esto puede tener un impacto negativo el rendimiento de la base de datos". [1 ]

Ejemplo

Guardar un archivo en GridFS, adaptado del tutorial de 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!'))
  ;
});