Publicado o lançamento do projeto FerretDB 0.1 (anteriormente MangoDB), que permite substituir o SGBD orientado a documentos MongoDB pelo PostgreSQL sem precisar alterar o código dos aplicativos. O FerretDB é implementado como um servidor proxy, traduzindo as requisições do MangoDB em consultas SQL para o PostgreSQL, o que permite que o PostgreSQL seja usado como o armazenamento real. O código é escrito na linguagem Go e é distribuído sob a licença Apache 2.0.
A necessidade de migração pode surgir devido à transição do MongoDB para uma licença não livre, a SSPL, que é baseada na licença AGPLv3, mas não é aberta, pois contém uma exigência discriminatória de fornecimento sob a licença SSPL não apenas do código do próprio aplicativo, mas também dos textos-fonte de todos os componentes envolvidos na oferta do serviço em nuvem.
O público-alvo do FerretDB são usuários que não utilizam as funcionalidades avançadas do MongoDB em seus aplicativos, mas desejam usar um stack de software totalmente aberto. Atualmente, o FerretDB suporta apenas parte das funcionalidades do MongoDB, as mais frequentemente utilizadas em aplicativos típicos. No futuro, eles planejam alcançar plena compatibilidade com os drivers do MongoDB e oferecer a possibilidade de usar o FerretDB como uma substituição transparente do MongoDB.
Lembramos que o MongoDB ocupa uma posição entre sistemas rápidos e escaláveis que operam dados no formato chave/valor e SGBDs relacionais, funcionais e convenientes na formação de consultas. O MongoDB suporta o armazenamento de documentos em formato semelhante ao JSON, possui uma linguagem bastante flexível para a formação de consultas, pode criar índices para vários atributos armazenados, garante de forma eficaz o armazenamento de grandes objetos binários, suporta o registro de operações de alteração e adição de dados ao BD, pode operar de acordo com a paradigma Map/Reduce, e suporta replicação e construção de configurações tolerantes a falhas.
Na versão 0.1.0 do FerretDB, o método de extração de dados do PostgreSQL foi totalmente reestruturado. Anteriormente, para cada solicitação recebida do MongoDB, uma única consulta SQL era gerada para o PostgreSQL, utilizando funções para trabalhar com o formato JSON e executando a filtragem de resultados no lado do PostgreSQL. Devido a diferenças na semântica das funções json do PostgreSQL e do MongoDB, havia inconsistências de comportamento ao comparar e classificar diferentes tipos. Para resolver esse problema, agora os dados são extraídos em excesso do PostgreSQL, e a filtragem dos resultados é feita no lado do FerretDB, permitindo replicar o comportamento do MongoDB na maioria das situações.
O preço do aumento da compatibilidade foi a diminuição do desempenho, que espera-se compensar em versões futuras por meio da filtragem seletiva apenas de solicitações, no lado do FerretDB, onde há discrepâncias de comportamento. Por exemplo, a consulta "db.collection.find({_id: 'some-id-value'})" pode ser completamente processada no PostgreSQL. O objetivo principal do projeto neste estágio é alcançar compatibilidade com o MongoDB, enquanto o desempenho fica em segundo plano. Entre as mudanças funcionais na nova versão está a suporte a todos os operadores bitwise, ao operador de comparação "$eq", assim como aos operadores "$elemMatch" e "$bitsAllClear".
Fonte: opennet.ru
