Por que usar o MongoDB com Ruby?
Avalie esse Artigo
Antes de descobrir o Ruby e o Ruby on Rails, eu era desenvolvedor .NET. Nesse momento, eu faria alterações ad-hoc em meu banco de dados de desenvolvimento, exportaria minhas definições de tabela/função/procedimento armazenado/visualização para arquivos de texto e as verificaria no controle de origem com quaisquer alterações de código. Usando a funcionalidade
diff
, eu comparava as alterações de esquema que os DBAs precisavam aplicar à produção e nós rastreamos isso separadamente.Estou certo de que existiram ferramentas melhores (e eventualmente comece a usar algumas das ferramentas doRedGate), mas eu estava procurando uma mudança. Nessa época, a verdadeira milagrosidade do Ruby on Rails para minha vida eram as migrações de registros ativos, que ajustaram o trabalho com meu banco de dados ao meu fluxo de trabalho de programação. O gerenciamento de esquemas se tornou menos trabalhoso e havia
rake
tarefas para tudo que eu precisasse (aplicar migrações, reverter alterações, semear um banco de dados de teste).A versão e o gerenciamento de esquemas com o Rails foram muito melhores do que o que eu estava usando, e não era como se isso pudesse ficar melhor — mas então me deparei com o MongoDB.
Ao trabalhar com o MongoDB, não há necessidade de
CREATE TABLE foo (id integer, bar varchar(255), ...)
; se uma coleção (ou banco de dados associado) não existir, a inserção de um novo documento o criará automaticamente para você. Isso significa que as migrações do Active Record não são mais necessárias, pois esse nível de gerenciamento de alterações de esquema não é mais necessário.Ter a flexibilidade de definir meu modelo de dados diretamente no código sem precisar recorrer ao gerenciamento intermediário que o Active Record facilitou meio que fazia sentido para mim. Agora eu podia manter o estado do objeto diretamente no meu banco de dados, incorporar detalhes do modelo relacionados e facilmente fazer consultas em torno dessas estruturas para recuperar meus dados rapidamente.
Os dados no MongoDB têm um esquema flexível, pois as collection não impõem uma estrutura ou esquema estrito de documentos por padrão. Essa flexibilidade oferece opções de modelagem de dados para atender ao seu aplicativo e aos requisitos de desempenho, o que se alinha perfeitamente ao foco do Ruby em simplicidade e produtividade.
Podemos demonstrar facilmente como começar rapidamente a usar o driver Ruby do MongoDB usando o seguinte script Ruby simples que se conectará a um cluster, inserirá um documento e o lerá de volta:
1 require 'bundler/inline' 2 3 gemfile do 4 source 'https://rubygems.org' 5 gem 'mongo' 6 end 7 8 client = Mongo::Client.new('mongodb+srv://username:password@mycluster.mongodb.net/test') 9 collection = client[:foo] 10 collection.insert_one({ bar: "baz" }) 11 12 puts collection.find.first 13 # => {"_id"=>BSON::ObjectId('62d83d9dceb023b20aff228a'), "bar"=>"baz"}
Quando o documento acima é inserido, um valor
_id
de BSON::ObjectId('62d83d9dceb023b20aff228a')
é criado. Todos os documentos devem ter um campo_id
.No entanto, se não for fornecido, um_id
padrão do tipo ObjectId
será gerado. Ao executar o comando acima, você obterá um valor diferente para _id
, ou você poderá optar por defini-lo explicitamente para qualquer valor que desejar!Sinta-se livre para dar uma volta no exemplo acima usando seu MongoDB existente ou MongoDB Atlas cluster MongoDB Atlas. Se você não tiver um MongoDB Atlas cluster, inscreva-se em um cluster de camada sempre gratuita para começar.
Para simplificar o exemplo acima, usamos
bundler/inline
para fornecer uma solução de arquivo único usando o Bundler. No entanto, a gemmongo
pode ser adicionada com a mesma facilidade a umGemfile
existente ou instalada por meio do gem install mongo
.Nossa amostra acima demonstra como criar e ler rapidamente um documento. A atualização e a exclusão de documentos são tão simples quanto mostrado abaixo:
1 # set a new field 'counter' to 1 2 collection.update_one({ _id: BSON::ObjectId('62d83d9dceb023b20aff228a')}, :"$set" => { counter: 1 }) 3 4 puts collection.find.first 5 # => {"_id"=>BSON::ObjectId('62d83d9dceb023b20aff228a'), "bar"=>"baz", "counter"=>1} 6 7 # increment the field 'counter' by one 8 collection.update_one({ _id: BSON::ObjectId('62d83d9dceb023b20aff228a')}, :"$inc" => { counter: 1 }) 9 10 puts collection.find.first 11 # => {"_id"=>BSON::ObjectId('62d83d9dceb023b20aff228a'), "bar"=>"baz", "counter"=>2} 12 13 # remove the test document 14 collection.delete_one({ _id: BSON::ObjectId('62d83d9dceb023b20aff228a') })
Embora toda a interação com o Atlas cluster possa ser feita diretamente usando o MongoDB Ruby Driver, a maioria dos desenvolvedores prefere uma camada de abstração, como um ORM ou ODM. Os desenvolvedores de Ruby podem usar o Mongoid ODM para modelar facilmente collection do MongoDB em seu código e simplificar a interação usando uma API fluída semelhante à Interface de Consulta do Active Record.
O exemplo a seguir adapta o exemplo anterior para usar o Mongoid:
1 require 'bundler/inline' 2 3 gemfile do 4 source 'https://rubygems.org' 5 6 gem 'mongoid' 7 end 8 9 Mongoid.configure do |config| 10 config.clients.default = { uri: "mongodb+srv://username:password@mycluster.mongodb.net/test" } 11 end 12 13 class Foo 14 include Mongoid::Document 15 16 field :bar, type: String 17 field :counter, type: Integer, default: 1 18 end 19 20 # create a new instance of 'Foo', which will assign a default value of 1 to the 'counter' field 21 foo = Foo.create bar: "baz" 22 23 puts foo.inspect 24 # => <Foo _id: 62d84be3ceb023b76a48df90, bar: "baz", counter: 1> 25 26 # interact with the instance variable 'foo' and modify fields programmatically 27 foo.counter += 1 28 29 # save the instance of the model, persisting changes back to MongoDB 30 foo.save! 31 32 puts foo.inspect 33 # => <Foo _id: 62d84be3ceb023b76a48df90, bar: "baz", counter: 2>
Esteja você usando Ruby/Rails para criar uma ferramenta de script/automação, um novo aplicativo web ou até mesmo a próxima Coinbase, o MongoDB oferece um driver que simplifica a interação com seus dados ou um ODM que integra perfeitamente seu modelo de dados com o código do seu aplicativo.
Interagir com seus dados MongoDB via Ruby — usando o Driver ou o ODM — é simples, mas você também pode interagir diretamente com seus dados do MongoDB Atlas usando o Data Explorerintegrado. No entanto, dependendo das suas preferências, há opções:
- O MongoDB para Visual Studio Code permite que você se conecte à sua instância do MongoDB e interaja de uma forma que se ajuste ao seu fluxo de trabalho nativo e às ferramentas de desenvolvimento. Você pode navegar e navegar por seus bancos de dados e coleções do MongoDB, e criar protótipos de queries e agregações para uso em seus aplicativos.
- O MongoDB Compass é uma ferramenta interativa para query, otimização e análise de dados do MongoDB. Obtenha insights importantes, arraste e solte para criar pipelines e muito mais.
- O Studio 3T é uma GUI de terceiro 3extremamente fácil de usar para interagir com seus dados do MongoDB.
- MongoDB Atlas Data API permite ler e escrever dados no MongoDB Atlas com HTTPS requests. Para usar a API, você só precisa de um cliente HTTPS e uma chave de API válida.
Ruby foi adicionado recentemente como uma opção de exportação de idioma ao MongoDB Compass e à extensão MongoDB VS Code. Usando essa integração, você pode converter facilmente um pipeline de agregação de qualquer ferramenta em código que pode ser copiado/coledo em seu aplicativo Ruby.