Hoje apresentarei um banco de dados de documentos de código aberto: FerretDB . Ele usa o PostgreSQL como armazenamento de banco de dados, é compatível com o protocolo MongoDB 6.0+ e pode ser usado como uma alternativa pronta para uso ao MongoDB .
⚠️Desde que o MongoDB modificou seu protocolo de código aberto (SSPL), muitos softwares de código aberto e software comercial não podem usar o MongoDB.
Em princípio, o FerretDB implementa um proxy sem estado que converte as consultas do protocolo MongoDB em instruções SQL para serem compatíveis com os drivers do MongoDB. O FerretDB é implementado usando a linguagem GO e segue o acordo de código aberto Apache-2.0. A primeira versão oficial foi lançada em 11 de abril de 2023 .
Como um banco de dados de documentos, o FerretDB usa BSON (JSON binário) para armazenar dados, que podem suportar mais tipos de dados do que JSON regular, mas atualmente não suportam números de ponto flutuante de 128 bits.
A coleção (Collection) no banco de dados do documento corresponde à tabela (Table) no PostgreSQL, e o documento (Document) corresponde à linha (Row). Para bancos de dados de documentos, não há necessidade de definir um esquema antes de inserir os dados. Isso o torna ideal para aplicativos que exigem um esquema flexível, como blogs, aplicativos de bate-papo, videogames e muito mais.
Baixar e instalar
O arquivo de instalação do FerretDB pode ser baixado através do link Github.Atualmente , apenas os pacotes de instalação Docker, DEB e RPM são fornecidos.
A maneira mais fácil de usá-lo é usar uma imagem do Docker, por exemplo:
docker run -d --rm --name ferretdb -p 27017:27017 ghcr.io/ferretdb/all-in-one
Observe que a imagem "all-in-one" padrão não é adequada para ambientes de produção. Outros tipos de imagem incluem desenvolvimento e produção. Para obter detalhes, consulte a documentação oficial .
O comando acima pode iniciar um contêiner incluindo FerretDB, PostgreSQL e MongoDB Shell, que pode ser usado para teste e experimentação.
Depois de iniciar o contêiner, podemos:
- Use a ferramenta cliente MongoDB para se conectar ao FerretDB, o URI é o seguinte:
mongodb://127.0.0.1:27017/
; - Execute o comando
mongosh
para se conectar ao FerretDB, MongoDB Shell pode ser instalado usando o seguinte comando:docker exec -it ferretdb mongosh
; - Execute o seguinte comando para se conectar ao PostgreSQL dentro do container:
docker exec -it ferretdb psql -U username ferretdb
. O FerretDB usa o esquema PostgreSQL como banco de dados MongoDB. Portanto, se usarmos o cliente MongoDB para criar algumas coleções no banco de dados de teste, podemos executar o comando PostgreSQLSET search_path = 'test';
para alternar para este modo e usar o comando psql\d
para visualizar as tabelas de dados correspondentes às coleções.
O comando para parar o container é o seguinte:
docker stop ferretdb
Para a instalação de pacotes binários, você pode consultar a documentação oficial .
operação basica
Em seguida, apresentamos algumas operações CURD básicas ao usar o FerretDB, que são as mesmas que as operações de documento no MongoDB.
criar documento
Os seguintes métodos podem ser usados para criar novos documentos.
db.collection.insertOne({
field1: value1, field2: value2,.... fieldN: valueN})
db.collection_name.insertMany([{
document1}, {
document2},... {
documentN}])
Eles são usados para criar um único documento e vários documentos, respectivamente. Eles criam a coleção primeiro, se ela não existir.
Por exemplo, o exemplo a seguir cria um novo documento para os cientistas da coleção:
db.scientists.insertOne({
name: {
firstname: "Thomas",
lastname: "Edison"
},
born: 1847,
invention: "lightbulb"
})
{
acknowledged: true,
insertedId: ObjectId("6346fcafd7a4a1b0b38eb2db")
}
Depois que a operação for bem-sucedida, ele retornará confirmado e o ID do documento gerado automaticamente.
Aqui está um exemplo que cria vários documentos:
db.scientists.insertMany([
{
name: {
firstname: "Alan",
lastname: "Turing"
},
born: 1912,
invention: "Turing Machine"
},
{
name: {
firstname: "Graham",
lastname: "Bell"
},
born: 1847,
invention: "telephone"
},
{
name: {
firstname: "Ada",
lastname: "Lovelace"
},
born: 1815,
invention: "computer programming"
}
])
ver documento
Os seguintes métodos podem ser usados para consultar documentos em uma coleção:
db.collection.find()
db.collection.findOne()
O exemplo a seguir consulta a primeira pergunta na coleção de cientistas que satisfaz a condição:
db.scientists.findOne({
invention: "Turing Machine"})
O método find() pode retornar todos os documentos da coleção, por exemplo:
db.scientists.find()
As operações de consulta podem pesquisar documentos com base em condições especificadas, que podem conter vários operadores ($gt, $lt, $in, etc.) e também podem consultar matrizes ou documentos aninhados.
atualizar documento
Os seguintes métodos podem ser usados para atualizar documentos:
db.collection.updateOne()
db.collection.updateMany()
db.collection.replaceOne()
Por exemplo, o exemplo a seguir atualiza documentos em que o campo de nome é igual a "Graham" para "Alexander Graham". O método updateOne() atualizará apenas o primeiro documento que satisfaça a condição.
db.scientists.updateOne({
firstname: "Graham"
},
{
$set:{
firstname: "Alexander Graham"
}
})
O exemplo a seguir usa o método replaceOne() para substituir o documento inteiro:
db.scientists.replaceOne({
lastname: "Bell",
},
{
lastname: "Einstein",
firstname: "Albert",
born: 1879,
invention: "Photoelectric effect",
nobel: true
})
excluir documento
Os seguintes métodos podem excluir documentos que atendem às condições:
db.collection.deleteOne()
db.collection.deleteMany()
Por exemplo, o exemplo a seguir exclui todos os documentos em que o campo nobel é falso:
db.scientists.deleteMany({
nobel:false})
diferenças conhecidas
Atualmente, o FerretDB tem algumas implementações diferentes do MongoDB:
- O FerretDB usa os mesmos nomes e códigos de erro de protocolo que o MongoDB, mas as mensagens de erro específicas podem ser diferentes em alguns casos;
- FerretDB não suporta caracteres NUL (\0) em strings;
- FerretDB não suporta arrays aninhados;
- FerretDB converterá zero negativo (-0) em zero positivo (0);
- Restrições do documento: a chave não pode conter um ponto (.), a chave não pode começar com um cifrão ($) e os campos do tipo double não podem conter Infinity, -Infinity ou NaN;
- O documento inserido não pode conter chaves duplicadas;
- Operações que atualizam documentos não podem produzir Infinity, -Infinity ou NaN;
- Nomes de bancos de dados e coleções não podem começar com a palavra reservada _ferretdb_, nomes de bancos de dados não podem conter letras não latinas, nomes de coleções devem ser caracteres UTF-8 válidos, nomes de bancos de dados não podem começar com um número e não podem conter letras maiúsculas.