Active Recordのその先へ ~RailsでMongoDBを使う~

2010年10月27日(水)
朝倉 慎一

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上で実現する手段、としても使えるのではないでしょうか。

株式会社日立ソリューションズ

技術開発本部 Rubyセンタ所属
1973生まれ。入社後、グループウェア、Webアプリケーションサーバなどの技術サポート業務に従事。現在は、RubyおよびRuby on Railsを中心にしたビジネスを推進中。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています