yujiro's blog

「インターネット上で正しい答えを得る最善の方法は、質問することではない。間違った答えを投稿することだ」by ウォード・カニンガム。 辛辣なコメントお待ちしております。

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の特徴を感じていただけたかなと思います。

以上です。