Atualizamos recentemente um complexo projeto Ruby on Rails para irmos do MongoDB 2.6 até o MongoDB 3.6. Saiba aqui nesse post o caminho das pedras que foi trilhado.
Além do projeto Rails, também atualizamos um serviço em Elixir saindo da mesma versão 2.6 rumo ao banco de dados versão 3.6, num processo envolvendo detalhes que falamos a seguir.
Vários projetos em Elixir, incluindo o Phoenix Framework, utilizam o Ecto como database wrapper, que traz como padrão suporte aos bancos PostgreSQL, MySQL, MSSQL, SQLite e Mnesia.
O MongoDB não é suportado por padrão pelo Ecto, então alguns membros da equipe do elixir-ecto e core team do elixir criaram pacotes para esse suporte, como por exemplo mongodb_ecto
e mongodb
.
O pacote mongodb_ecto
, em uso até então, não suporta o MongoDB além da versão 3.0, e, portanto, precisou ser descontinuado em nosso projeto. A partir daí passamos a utilizar o mongodb
, dos mesmos autores, que atualmente suporta até o MongoDB 4.0. Embora pareça simples, essa alteração requer que mudemos totalmente a forma de trabalho anterior com o banco de dados.
O mongodb_ecto
é um adapter do MongoDB para o Ecto
. Então, necessariamente precisamos do Ecto em nossas dependências, e com isso podemos trabalhar com o banco de dados de maneira similar aos outros bancos de dados suportados por padrão - incluindo configuração semelhante de conexão, inicialização e API das queries.
Já o mongodb
é um driver do MongoDB para Elixir. Assim, é independente do Ecto
, e tem sua maneira própria de lidar com configurações de conexão, e diferente maneira de trabalhar com queries e resultados das queries.
A nível de repositório, como ambos projetos são Open Source, podemos notar que o mongodb
possui mais forks, mais stars, mais releases, mais commits e mais contribuidores, sendo atualizado também com frequência muito maior do que o mongodb_ecto
. Além disso, um dos grandes posts de referência nesse tópico já recomenda o uso do mongodb
frente ao mongodb_ecto
lá em 2017.
Importante frisar que ainda assim é possível trabalhar com o mongodb
e ecto
no mesmo projeto, caso seja necessário.
Além do repositório Github do pacote mongodb
, a documentação do HexDocs do projeto apresenta como instalar o driver em seu projeto e mostra também exemplos de conexões com pooling e Replica Sets, bem como algumas queries básicas mas suficientes para o pontapé inicial.
Outro ponto importante é que, enquanto o mongodb_ecto
retorna o resultado de queries ObjectID como string, o mongodb
retorna como de fato BSON ObjectID. Com isso é comum que precisemos fazer essa conversão ao longo do projeto, e para isso podemos contar com os métodos decode!/1
e encode!/1
do próprio driver. Mais detalhes desses métodos na documentação Hex Docs
Happy coding!