Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] Envio de grande volume de dados ao MongoDB

Fala pessoal, tudo bem?

Tenho uma dúvida a respeito do MongoDB. Eu criei uma API para que eu possa enviar os dados de uma planilha no Google Sheets para o MongoDB. Por meio do App Script, eu aciono a função que faz uma requisição a API e faz o envio dos dados por lote a base de dados. Utilizo a versão gratuita do MongoDB, a principio eu conseguia enviar lotes de 700 dados, mas aos poucos, conseguia enviar 500 dados, 300, 100 e atualmente não consigo enviar nem 50 dados, pois o App Script encerra a execução de qualquer função que estoure os 6 minutos (isso porque, a medida que estou enviando dados, o MongoDB demora cada vez mais para concluir a requisição 'post'). O envio é feito em lote, mas os dados enviado a API é de objeto em objeto. Como eu faria para mandar um Array de uma quantidade X de objetos ao MongoDB?

3 respostas

Oii Daniel, tudo bem?

Para contornar isso, posso te ajudar com algumas sugestões. Por ser um projeto externo no qual não tenho o contexto do código, você pode adaptar as sugestões de uma forma que faça sentido para o projeto.

Então, você pode dividir as arrays em lotes menores, com o método $slice() ou com a biblioteca Lodash é possível fazer e facilita essa divisão. Outra alternativa é minimizar o tempo de resposta do MongoDB e otimizar as requisições à API, envie os dados em formato JSON, para isso utilize compressão de dados para reduzir o tamanho das requisições e agrupe requisições frequentes em uma única operação sempre que possível. Essas práticas melhoram a eficiência da serialização, deserialização e transmissão dos dados, além de reduzir a sobrecarga de comunicação.

Além disso, gerencie o tempo de execução, monitorando o tempo decorrido em cada iteração do loop. Se o tempo total se aproximar do limite, interrompa a execução do loop e armazene o lote atual em um local persistente, como o Google Drive ou um banco de dados auxiliar. Na próxima execução do script, recupere o lote armazenado e continue o processo de envio a partir do ponto onde foi interrompido.

Reuni alguns links que podem te ajudar nos estudos:

Espero que uma das sugestões te ajude durante o seu projeto.

Bons estudos, Daniel!

Oi Nathalia! Tudo bem?

Havia lido sobre a documentação do App Script e do MongoDB. Do lado do App Script, acredito que não tem muito para onde mexer. Quanto ao MongoDB, estou lendo sobre o método slice que você me enviou e me surgiu uma dúvida:

Pelo o que entendi, com o Slice, eu consigo enviar Array de objetos ao invés de objeto a objeto como é feito na minha API hoje. Seria isso ou entendi errado?

Pois dentro da minha API eu envio objeto a objeto e a medida que vou enviando dados, a performance de envio cai...hoje eu tenho um acionador no App Script que roda de 10 em 10 minutos para enviar os dados, pois estou tentando enviar mais de 100.000 linhas de uma única aba (há outras 4).

De imediato, muito obrigado pela ajuda.

Grande abraço!

solução!

Oi Nathalia!

Sobre esta dúvida. Fui explorando a documentação do Mongo DB e encontrei o método 'insertMany'. Ele até me atenderia e faz o que preciso. Porém, mesmo separando em lotes, ainda mantém o problema de performance. Ajustei a API e fiz o envio pelo Postman, que enviou com sucesso. Porém, levou muito mais do que 6 minutos para enviar todos os dados para o MongoDB. Pelo o que tenho visto, parece que este problema de performance é bastante frequente em soluções e serviços free quando o volume de dados é muito grande, e portanto, o MonboDB em si não me atenderia. Portanto, optei por seguir com uma outra estratégia: vou tentar utilizar o Colab para ler os dados do Google Sheets e criar um arquivo .db.

De qualquer modo agradeço a ajuda e vou deixar a documentação do insertMany do MongoDB, caso ajude alguém no futuro.

InsertMany

Grande abraço!