Active Recordのその先へ ~RailsでMongoDBを使う~
3. MongoDBのドキュメント操作
MongoDBのドキュメントに対してマップするモデルを作成し、Railsアプリケーションからドキュメントを操作してみましょう。リスト3のような内容のドキュメントを作るための、モデル・クラスを作成します。
リスト3: MongoDBのドキュメントの例
MongoDBは、スキーマレスのデータベースです。MongoDB側に、あらかじめ何かを定義することはありません。実際には、Railsのクラスで定義した内容に従って、構造が決定されます。
リスト3のドキュメントにマップするクラスを、Personとしましょう。Railsのルールに従い、MongoDBには、複数形のpeopleがコレクションとして定義されます。MongoDBでは、ドキュメントの集合をコレクションと呼びます。
mongoidを使うと、モデルを作成するジェネレータが、mongoidを使うように置き換えられています。このため、通常のモデル作成と同じく、"rails g model モデル名"で、クラス・ファイルのひな型を作成できます。作成したひな型を元に、リスト4のようなPersonクラスを記述します。
リスト4: Personクラス
マイグレーション・スクリプトは、作成する必要がありません。クラス内で定義したフィールドが、MongoDBに定義されます。
リスト3のドキュメントには、addressという入れ子になった構造があります。このため、このaddressにマップするAddressクラスも作成します(リスト5)。
リスト5: Addressクラス
作成したクラスを使用して、MongoDBを操作してみましょう。ここでは、Railsコンソールを使った例を、画面5に示します。
画面5: RailsからMongoDBの操作例
> person = Person.new(:first_name => "太郎") => #<person _id:="" created_at:="" first_name:="" last_name:="" updated_at:=""> > person.last_name = "日立" => "日立" > person.build_address(:prefecture => "東京都", :city => "品川区", :street => "東品川4-12-7") => # <address 7="" _id:="" city:="" prefecture:="" street:="" zip_code:=""> > person.save => true > person = Person.last => #<person 07:14:28="" 15="" _id:="" created_at:="" first_name:="" fri="" last_name:="" oct="" updated_at:="" utc=""> > person.address => #</person></address> <address 7="" _id:="" city:="" prefecture:="" street:="" zip_code:=""> > person.address.update_attributes!(:zip_code => "140-0002") => true</address> </person>
Active Recordと同じように操作できることが分かります。
最後に、MongoDBのコンソールを起動して、データがどのように保存されているのかを見てみましょう。
画面6: MongoDBコンソールでのデータ確認
# mongo MongoDB shell version: 1.6.3 connecting to: test > show dbs admin local Railsアプリケーション名_development > use Railsアプリケーション名_development switched to db Railsアプリケーション名_development > show collections people system.indexes > db.people.find() { "_id" : ObjectId("4cb7ff3bc4eabd0ee4000005"), "address" : { "_id" : ObjectId("4cb7ff4bc4eabd0ee4000006"), "city" : "品川区", "prefecture" : "東京都", "street" : "東品川4-12-7", "zip_code" : "140-0002" }, "created_at" : "Fri Oct 15 2010 16:14:28 GMT+0900 (JST)", "first_name" : "太郎", "last_name" : "日立", "updated_at" : "Fri Oct 15 2010 16:14:28 GMT+0900 (JST)" }
addressが入れ子構造になっていることが分かります。
4. おわりに
ドキュメント指向データベースとしては、MongoDBのほかに、CouchDBと呼ぶオープン・ソースのデータベースがあります。オープンソース以外では、Amazon SimpleDBやLotus Notes/Dominoも、ドキュメント指向データベースです。なお、CouchDBは、Lotus Notes/Domino 6の開発を行っていたDamien Katz氏が開発したデータベースです。
ドキュメント指向データベースは、リレーショナル・データベースを扱ってきた人には、扱いにくいかも知れません。一方、Lotus Notes/Domino技術者にとっては、なじみやすいと思います。NoSQLデータベースは、その性能の良さばかりが注目されていますが、Lotus Notes/Domino上に作るような業務アプリケーションをRails上で実現する手段、としても使えるのではないでしょうか。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Railsでデータベースを扱うためのライブラリActive Recordについて学んでみた
- Active Recordの使い方
- SoftLayerでMongoDB環境を構築してみよう
- Custom User Dataを利用してユーザーに管理者属性を追加しよう
- Active Recordのバリデーションやコールバックについて深く掘り下げてみた
- 実践「Heroku」をセットアップしてサンプルアプリを動かそう
- RailsでAction Controllerについて学んでみた
- MongoDB Realmを利用したCRUD機能を実装しよう
- ドキュメント指向データベースと列指向データベース
- Rubyを使ったエンタープライズ・インテグレーション