Bancos de Dados

Utilizando MongoDB com o Podman

  • bancos de dados
  • big data
  • container
  • desenvolvimento
  • MongoDB
  • NoSQL
Última atualização: 2023-09-21

Resumo

MongoDB é um dos bancos de dados orientados a documentos mais utilizados no mercado. No entanto, como possui uma licença proprietária (desde 2018), as distribuições Linux removeram o banco de dados de sua lista de pacotes, porém, é possível utilizar o MongoDB a partir de imagens de container, como demonstrado aqui, em um exemplo que utiliza a importação de dados a partir de arquivos CSV como demontração do ambiente.

Posts Relacionados

O MongoDB utiliza uma licença proprietária (SSPL), ou seja, uma licença que não é livre e não é compatível com licenças open source comuns com GPL, Apache ou BSD, e, por esse motivos, foi removido das distribuições Linux. Como alternativa, para poder desenvolver utilizando o MongoDB de forma relativamente fácil e repetível, podemos utilizar um container baseado no Docker ou Podman.

Aqui, utilizarei o podman, pois assim é possível utilizar um usuário sem privilégios. Para usar o docker talvez seja necessário, apenas, trocar o comando podman por docker, uma vez que a ideia do Podman é que ele seja um substituto direto do Docker.

Como a ideia é preparar um ambiente que permita o desenvolvimento utilizando MongoDB, será criado um projeto de importação de dados a partir de um arquivo CSV.

Crie um diretório para o projeto:

$ mkdir mongo_test
$ cd mongo_test

Quando utilizamos um container, ao encerrá-lo os dados do container são perdidos, e, para esse projeto, é interessante que possamos acessar os dados criados mesmo após a exclusão do container. Para isso, crie um diretório para armazenar os dados:

$ mkdir data

Crie um arquivo CSV com os dados a serem importados, por exemplo o arquivo ${PWD}/import/users.csv:

id,first_name,last_name,email,gender
1,Annamarie,Sexten,asexten0@admin.ch,Genderqueer
2,Bartholomew,Summerson,bsummerson1@sina.com.cn,Male
3,Lalo,Dumbelton,ldumbelton2@friendfeed.com,Male
4,Clayborne,Tincknell,ctincknell3@google.fr,Male
5,Paula,Oley,poley4@soundcloud.com,Female
6,Alexandr,Burkert,aburkert5@com.com,Genderfluid
7,Temple,Breens,tbreens6@technorati.com,Male
8,Vance,Gallifont,vgallifont7@theguardian.com,Male
9,Koenraad,Weavill,kweavill8@foxnews.com,Male

Para inicializar o container, utilize:

$ podman run --name mongo-container \
    --volume "${PWD}/data:/data/db:Z" \
    -dt \
    docker.io/library/mongo:latest

Ao executarmos o comando run do podman, um container será criado com o nome fornecido em --name, utilizando a imagem especificada (docker.io/library/mongo:lates no exemplo). O uso do argumento -d em conjunto com o argumento -t permite que o container continue executando em background após a sua criação e inicialização. Sem isso, o container irá encerrar e parar a execução.

O parâmetro --volume é muito importante pois permite utilizar a mesma base de dados caso o container precise ser recriado novamente. Para apagar a base de dados, basta apagar o diretório data, recriá-lo, e executar os passos de importação dos dados novamente.

Para importar os dados, utilize:

$ podman exec -i mongo-container \
    mongoimport \
        --db=Company \
        --collection=Users \
        --drop \
        --mode=insert \
        --type=csv \
        --headerline < "${PWD}/import/users.csv"

O argumento -i permite que o podman redirecione os dados recebidos via stdin para o comando sendo executado no container. Os dados estão sendo lidos do arquivo criado anteriormente. No lado do mongoimport, os parâmetros são:

Note que, nesse exemplo, o arquivo contém a lista de campos na primeira linha. Caso o arquivo CSV não tenha a definição dos campos, utilize o parâmetro --fields, passando o nome dos campos, por exemplo --fields id,first_name,last_name,email,gender.

Com os dados disponíveis, podemos utilizar o mongosh para manipulá-los:

$ podman exec -it \
    mongo-container \
    mongosh

Podemos também consultá-los com uma única linha de comando:

$ podman exec -i mongo-container \
    mongosh Company <<< 'db.Users.find({gender:{$ne: "Male"}})'

Nesse caso, passamos o endereço do banco de dados (no exemplo utilizado Company em localhost), e utilizamos o redirecionamento de texto (<<<) para executar uma consulta na coleção Users.

Para esse exemplo a saída seria:

Company> [
  {
    _id: ObjectId("650cfe6b52dd9225bf9f635b"),
    id: 1,
    first_name: 'Annamarie',
    last_name: 'Sexten',
    email: 'asexten0@admin.ch',
    gender: 'Genderqueer'
  },
  {
    _id: ObjectId("650cfe6b52dd9225bf9f6362"),
    id: 6,
    first_name: 'Alexandr',
    last_name: 'Burkert',
    email: 'aburkert5@com.com',
    gender: 'Genderfluid'
  },
  {
    _id: ObjectId("650cfe6b52dd9225bf9f6363"),
    id: 5,
    first_name: 'Paula',
    last_name: 'Oley',
    email: 'poley4@soundcloud.com',
    gender: 'Female'
  }
]

Apesar da ausência dos pacotes do MongoDB nas atuais distribuições Linux, utilizá-lo de forma local continua sendo bastante simples com o uso de containers, com a vantagem que fica muito mais fácil de recriar o ambiente de desenvolvimento num ambiente de testes, o recriar um ambiente semelhante ao de produção para o desenvolvimento.

Recursos Extras