FerretDB: uma alternativa ao MongoDB baseada no PostgreSQL

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 mongoshpara 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 PostgreSQL SET search_path = 'test';para alternar para este modo e usar o comando psql \dpara 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:

  1. 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;
  2. FerretDB não suporta caracteres NUL (\0) em strings;
  3. FerretDB não suporta arrays aninhados;
  4. FerretDB converterá zero negativo (-0) em zero positivo (0);
  5. 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;
  6. O documento inserido não pode conter chaves duplicadas;
  7. Operações que atualizam documentos não podem produzir Infinity, -Infinity ou NaN;
  8. 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.

Acho que você gosta

Origin blog.csdn.net/horses/article/details/129295615
Recomendado
Clasificación