Rails にmongoid をいれてMongoDBを操作してみる
MongoDB はDBですが、以下の特徴があります。
詳細については以下がわかりやすいです。
https://utage.headwaters.co.jp/blog/?p=5051
こちらをmongoid というORMを入れて、Rails からいじってみようという試みです。
環境
Ubuntu 14.04
Ruby 2.3.1
Rails 5.0.6
手順
MongoDBをインストール
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
$ echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
$ sudo apt-get update
$ sudo apt-get install mongodb-10gen
$ sudo service mongodb status
mongodb start/running, process 4239
OK。
Rails 側
$ rails new -O mongodb-test.com --skip-bundle
-O はActiveRecord をいれないというオプション。
mongodb-test.com に移動して、Gemfile をいじる
gem 'mongoid', '~> 6.0.0' gem 'bson_ext'
$ bundle install --path vendor/bundle --binstubs
vendor/bundle にインストールさせ、 bin ディレクトリを作るオプションが含まれています。こちらは各々のやりかたでOKです。
続いて
$ bin/rails g mongoid:config
を実行すると config/mongoid.yml がつくられます。
モデルを作ってみましょう。
$ bin/rails g model Article --timestamps
実行します。
app/models/article.rb
class Article include Mongoid::Document include Mongoid::Timestamps end
って感じになっているかと思います。
各カラムはモデルのコードに定義します。
なのでコードを
class Article include Mongoid::Document include Mongoid::Timestamps field :title, type: String end
に変えてみましょう。因みに rails g model するときに指定してもOKです。
ここでmongoDBを見てみます
$ mongo
MongoDB shell version: 2.4.14 connecting to: test > show dbs; local 0.078125GB mongodb_test_com_development (empty) mongodb_test_com_test (empty) > use mongodb_test_com_development switched to db mongodb_test_com_development > show collections;
show collections で何も帰ってきません。 これはDBがempty で何のレコード(document)がないからです。
こちらを作ってみましょう。rails console 使います。
$ bin/rails c
因みにこちらですが、先程の rails new するときに -O をいれないとエラーになります。
普通にActiveRecord と同じように create してみます。
irb(main):001:0> Article.create(title: 'Hoge')
=> #<Article _id: 5a0e830f07202a4bd49fa692, created_at: 2017-11-17 06:34:55 UTC, updated_at: 2017-11-17 06:34:55 UTC, title: "Hoge">
保存されます。
ここでもう一回mongo コマンドで中身を見てみましょう。
.... 省略 > show collections; articles system.indexes > db.articles.find(); { "_id" : ObjectId("5a0e830f07202a4bd49fa692"), "title" : "Hoge", "updated_at" : ISODate("2017-11-17T06:34:55.169Z"), "created_at" : ISODate("2017-11-17T06:34:55.169Z") }
てな感じで、テーブル(collection)とレコード(document)が作られています。
じゃあ、モデルを変えてみましょう。
class Article include Mongoid::Document include Mongoid::Timestamps field :title, type: String field :description, type: String end
それで
$ bin/rails c
irb(main):001:0> Article.create(title: 'Hoge', description: 'FugaPiyo') => #<Article _id: 5a0e8a9707202a4ddb0b387d, created_at: 2017-11-17 07:07:03 UTC, updated_at: 2017-11-17 07:07:03 UTC, title: "Hoge", description: "FugaPiyo">
これが普通に通ります。びっくりですね。
MongoDBでは,データベースごとに複数のコレクションを持ち,コレクションごとに複数のドキュメントを持ちます。ドキュメントはJSON形式で,以下のような構造をしています。 ...
https://utage.headwaters.co.jp/blog/?p=5051
要はJSON形式でデータを持っていて、それはフォーマットがバラバラでも大丈夫だよってことですね。
少しでもスキーマレスでドキュメント指向なMongoDBの特徴を感じていただけたかなと思います。
以上です。