Ruby Freaks Lounge

第31回 RubyistのためのMongoDB入門(1)

この記事を読むのに必要な時間:およそ 3 分

先に進む前に,MongoDBで使われる用語について確認しておきましょう。

ドキュメント
リレーショナルデータベースのレコードに相当します。MongoDBではドキュメントをBSON(バイナリ化されたJSON)として扱います。
コレクション
リレーショナルデータベースのテーブルに相当します。複数のドキュメントが格納されます。
データベース
複数のコレクションが格納されます。

ドキュメントの作成

ドキュメントの作成にはdb.<コレクション名>.save(<オブジェクト>)を使います。該当するコレクションがない場合は自動的に作成されます。

それでは実際に,ユーザを表すドキュメントを作成してみましょう。コレクション名はusersとします。

> db.users.save({name: 'ursm'})

db.<コレクション名>.find()でドキュメントを取り出せます。

> db.users.find()
{ "_id" : ObjectId("4b6f40fb047606970896546e"), "name" : "ursm" }

MongoDBはスキーマレスなので,コレクション中に異なるキーを持つドキュメントが混在していても問題ありません。

> db.users.save({name: 'kakutani', blog: 'http://kakutani.com'})

文字列だけでなく,数値や日付,配列やドキュメントなど様々な種類のデータを格納できます。ドキュメントに値として埋め込まれたドキュメントをEmbedded Documentと呼びます。

> db.users.save({name: 'moro', tags: ['ruby', 'rails'], login_count: {today: 5, total: 25}})

ドキュメントの検索

ドキュメントを検索するにはfind()の引数で条件を指定します。名前が"ursm"に一致するドキュメントを検索してみましょう。

> db.users.find({name: 'ursm'})
{ "_id" : ObjectId("4b6f40fb047606970896546e"), "name" : "ursm" }

名前に"r"を含むドキュメントを検索します。

> db.users.find({name: /r/})
{ "_id" : ObjectId("4b6f40fb047606970896546e"), "name" : "ursm" }
{ "_id" : ObjectId("4b6f49870476069708965471"), "name" : "moro", "tags" : [ "ruby", "rails" ], "login_count" : { "today" : 5, "total" : 25 }}

"ruby"というタグが付けられたドキュメントを検索します。値が配列のキーに対して単一の値で検索すると,配列の中に値が含まれているかをチェックしてくれます。

> db.users.find({tags: 'ruby'})
{ "_id" : ObjectId("4b6f49870476069708965471"), "name" : "moro", "tags" : [ "ruby", "rails" ], "login_count" : { "today" : 5, "total" : 25 } }

Embedded Documentによる検索もできます。キー名を"."で区切って階層を表します。

> db.users.find({'login_count.today': 5})
{ "_id" : ObjectId("4b6f49870476069708965471"), "name" : "moro", "tags" : [ "ruby", "rails" ], "login_count" : { "today" : 5, "total" : 25 } }

他にも様々な機能がありますが,長くなってきたのでこのぐらいにしておきましょう。対話型シェルの使い方は「Overview - The MongoDB Interactive Shell」を,クエリの詳細は「Advanced Queries」を参照してください。

まとめ

今回は,MongoDBの概要と単体での使い方を説明しました。次回は,Rubyからの使い方を紹介します。

著者プロフィール

浦嶌啓太(うらしまけいた)

(株)永和システムマネジメントサービスプロバイディング事業部所属,日本Hamlの会会長。Gentoo LinuxとKinesis Contoured Keyboardが好きなRubyプログラマ。BtoCサービスや業務システム,R&D案件の受託開発を日々行っている。

ブログ:http://d.hatena.ne.jp/ursm/
Twitter:http://twitter.com/ursm

コメント

コメントの記入