MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como salvar um arquivo JSON usando GridFs


É muito provável que não valha a pena armazenar os dados no Mongo usando o GridFS.

Os dados binários nunca pertencem a um banco de dados, mas se os dados forem pequenos, os benefícios de colocá-los no banco de dados (capacidade de consulta) superam as desvantagens (carga do servidor, lenta).

Nesse caso, parece que você gostaria de armazenar dados de documentos (JSON) no GridFS. Você pode fazer isso e armazená-lo da mesma forma que armazenaria qualquer outro dado binário. Os dados, no entanto, serão opacos. Você não pode consultar dados JSON armazenados em um documento GridFS, apenas os metadados do arquivo.

Consultando big data


Como você mencionou que deseja consultar os dados, verifique o formato dos seus dados. Se seus dados estiverem no formato listado no exemplo, parece que não há necessidade de consultas complicadas, apenas correspondência de strings. Portanto, existem várias opções.

Caso 1:Grandes Dados, Poucos Pontos


Se você não tiver muitos conjuntos de dados (pares de field1 e field2 ), mas os dados de cada um são grandes (field2 contém muitos bytes), armazene-os em outro lugar e armazene apenas uma referência a isso. Uma solução simples seria armazenar os dados (anteriormente field2 ) em um arquivo de texto no Amazon S3 e armazene e armazene o link. por exemplo.
{
  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:Pequenos dados, muitos pontos


Se cada conjunto de dados for pequeno (menos de 16 MB), mas houver muitos conjuntos de dados, armazene seus dados no MongoDB (sem GridFS).

Especificidades


No seu caso, os dados são bastante grandes e é desaconselhável armazená-los usando GridFS.

Esta resposta fornece uma referência para baixo. O benchmark parece indicar que o tempo de recuperação é mais ou menos diretamente proporcional ao tamanho do arquivo. Com a mesma configuração, levaria 80 segundos para recuperar um documento do banco de dados.

Otimizações possíveis


O tamanho padrão do bloco no GridFS é 255 KiB. Você pode reduzir os tempos de acesso a arquivos grandes aumentando o tamanho do bloco para o máximo (16 MB). Se o tamanho do fragmento for o único gargalo, usar o tamanho do fragmento de 16 MB reduziria o tempo de recuperação de 80 segundos para 1,3 segundos (80 / (16 MB/255 KiB) =1,3). Você pode fazer isso ao inicializar o bucket do GridFS.
new GridFSBucket(db, {chunkSizeBytes: 16000000})

Uma estratégia melhor seria armazenar o único nome de arquivo no Mongo e recuperar o arquivo do sistema de arquivos.

Outras desvantagens


Outra possível desvantagem de armazenar os dados binários no Mongo vem de este site :"Se os dados binários forem grandes, carregar os dados binários na memória pode fazer com que os documentos de texto (dados estruturados) acessados ​​com frequência sejam empurrados para fora da memória ou, mais geralmente, o conjunto de trabalho pode não caber na RAM. Isso pode afetar negativamente o desempenho do banco de dados." [1 ]

Exemplo


Salvando um arquivo no GridFS, adaptado do tutorial do 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!'))
  ;
});