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:
UsersUserscsv ou json)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.