Ruby Tutorial のオレオレ訳。
* データベースサポート
Ruby プログラマーは MongoDB を利用するのに次の 3 種類の方法を選べる。
* ドライバ
2 種類のドライバが存在する。
* ドキュメンテーション
mongo-ruby-driver API documentation を参照。
* ドライバのインストール
RubyGem からインストールするには下記の通り。
$ gem sources -a http://gems.github.com
$ sudo gem install mongodb-mongo
最初の行で GitHub のリポジトリを追加している。ソースコードからインストールする方法は README.rdoc を参照のこと。
* mongo-ruby-driver を使う
** RubyGem を使う
全てのコードは下記の実行が必要。
require 'rubygems' # not necessary for Ruby 1.9
require 'mongo'
** MongoDB へ接続する
XGen::Mongo::Driver::Mongo のインスタンスは Mongo サーバを表す。Mongo インスタンスは、名前をつけられたデータベースを表す XGen::Mongo::Driver::DB インスタンスを獲得するために使われる。このデータベースは存在する必要は無い。存在しない場合は作成される。
Mongo サーバに接続する際、サーバのアドレス/ポートを指定することが出来る。下記の例は、ローカルホストの "mydb" へ接続する例である。
db = XGen::Mongo::Driver::Mongo.new.db("mydb")
db = XGen::Mongo::Driver::Mongo.new("localhost").db("mydb")
db = XGen::Mongo::Driver::Mongo.new("localhost", 27017).db("mydb")
この時点で、上記の db オブジェクトは Mongo サーバ上の指定されたデータベースに接続される。個々の DB インスタンスは、サーバへ接続するために、個々のソケット接続を用いる。
** データベースを一覧する
m = XGen::Mongo::Driver::Mongo.new # (optional host/port args)
m.database_names.each { |name| puts name }
m.database_info.each { |info| puts info.inspect}
* データベースの削除
m.drop_database('database_name')
** 認証 ( オプション )
MongoDB は、name と password で認証された secure モードで実行できる。サーバが secure モードで実行されると、全てのクライアントは全ての操作を実行する前に、name と password を伝える必要がある。Ruby ドライバを使用する際は、接続済みの DB オブジェクトに対して下記のように実行する。
auth = db.authenticate(my_user_name, my_password)
name と password が正しい場合は、上記の auth は true になる。反対に正しくない場合は false になる。可能ならば、MongoDB ログを参照すべきだ。
** コレクションの一覧を取得する
個々のデータベースは 0 個以上のコレクションを保持している。データベースからコレクションの一覧を取得することが出来る。
db.collection_names.each { |name| puts name }
データベースに name と addres という二つのコレクションがあるとすれば、上記を実行すると下記の出力がある。
name
address
** コレクションを取得する
コレクションを取得するには、コレクションの名前を指定して collection(String collectionName) メソッドを用いる。
coll = db.collection("testCollection")
コレクションオブジェクトを取得することにより、コレクションへのデータの挿入や、クエリの実行が可能になる。
** ドキュメントの挿入
コレクションオブジェクトを取得することにより、コレクションへのデータの挿入が可能になる。例として、下記のような JSON ドキュメントを作成する。
{
"name" : "MongoDB",
"type" : "database",
"count" : 1,
"info" : {
x : 203,
y : 102
}
}
上記の例は、埋め込まれた JSON ドキュメントを保持していることに注意が必要である。これを実行するために、Hash か ドライバで用意している OrderedHash ( キー順を保存する ) を用いることができる。そして、コレクションに挿入するために insert() メソッドを用いる。
doc = {"name" => "MongoDB", "type" => "database", "count" => 1,
"info" => {"x" => 203, "y" => '102'}}
coll.insert(doc)
** find_first() を用いてコレクションの最初のドキュメントを検索する
前節で挿入したドキュメントを照会するには、find_first() を実行する。このメソッドは、単一のドキュメントを返す。カーソルを扱う必要は無い。
my_doc = coll.find_first()
puts my_doc.inspect
上記を実行することにより、下記の出力を得る。
{"_id"=>#, "name"=>"MongoDB", "info"=>{"x"=>203, "y"=>102}, "type"=>"database", "count"=>1}
: _id エレメントは MongoDB により自動的に追加される。MongoDB は、_ で始まるエレメント名について、内部利用のため予約している。find_first() は、他の Mongo のドキュメントや Java ドライバにおいては、findOne と呼ばれている。
** 複数ドキュメントの追加
興味深い他のクエリの実行のために、複数のドキュメントをコレクションへ追加する。これらのドキュメントは下記のようなものだ。
{
"i" : value
}
これを簡単に行うために、下記のようにする。
100.times { |i| coll.insert("i" => i) }
注: 同一のコレクションに異なる形式のドキュメントを挿入することができる。これらのレコードは、同じコレクション内に複合レコードとして格納される。この振る舞いは、MongoDB は "スキーマフリー" であるということの意味である。
** コレクション内のドキュメントをカウントする
これまでに私たちは 101 のドキュメントを挿入した。count() メソッドを使ってチェックしてみよう。
puts coll.count()
101 と出力される。
** 全てのドキュメントを取得するためにカーソルを使う
コレクションの中の全てのドキュメントを取得するためには find() メッソッドを使う。find() メッソッドは、クエリにマッチしたドキュメントを繰り返すための Cursor オブジェクトを返す。Ruby ドライバの Cursor は enumerable である。そのため、全てのドキュメントをクエリし出力するには下記のようにする。
coll.find().each { |row| puts row.inspect }
これによりコレクションに含まれる 101 のドキュメントが出力される。
** ひとつのドキュメントをクエリする
コレクションに含まれる一部のドキュメントを取得するために、find() メソッドにハッシュを渡すことが出来る。例として、フィールド "i" が 71 であるドキュメントを得たいとすると、下記のようになる。
coll.find("i" => 71).each { |row| puts row.inspect }
そしてひとつのドキュメントが出力される。
{"_id"=>#, "i"=>71}
** クエリによりドキュメントのセットを取得する
クエリは、コレクションからドキュメントのセットを取得するのにも使える。例として、フィールド "i" が 51 を越えるドキュメントを得たいとすると、下記のようになる。
coll.find("i" => {"$gt" => 50}).each { |row| puts row }
同じように、20 < i <= 30 であるドキュメントは下記のようになる。
coll.find("i" => {"$gt" => 20, "$lte" => 30}).each { |row| puts row }
** OrderedHash
操作の順序が重要な場合は、キーの挿入順序を保存する XGen::Mongo::Driver::OrderedHash を利用する。また、Ruby 1.9 では、Ruby の Hash が挿入順序を保存するようになったため、OrderedHash を利用する必要はない。
** インデックスを作成する
MongoDBはインデックスをサポートしており、簡単にコレクションに追加できる。インデックスを作成するために、インデックスの名前と、インデックスを付けるためのフィールド名を指定することが必要である。下記は "i" の昇順のインデックスを作成する。
# create_index assumes ascending order; see method docs
# for details
coll.create_index("my_index_name", "i")
降順のインデックスを指定するためには、少し複雑な書式が必要である。フィールド名をキーに、値に 1 か -1 を持つ Hash で指定する必要がある。1 は昇順を意味し、-1 は降順を意味する。上記の create_index の呼び出しと、下記の呼び出しは等価である。
# explicit "ascending"
coll.create_index("my_index_name", {"i" => 1})
** コレクションのインデックスの一覧を取得する
コレクションに定義されたインデックスの一覧を取得することが出来る。
coll.index_information.each { |info| puts info.inspect }
下記の出力を得る。
{:ns=>"test", :name=>"my_index_name", :keys=>{"i"=>1}}
** データベース管理
DB オブジェクトは admin メソッドを持ち、管理機能を持つオブジェクトを返す。
admin = db.admin
データベースは、:off 、:slow_only 、:all という 3 つの分析レベルを持ち、データベースの分析レベルを照会するには下記のようにする。
puts admin.profiling_level # => off (the symbol :off printed as a string)
admin.profiling_level = :slow_only
コレクションの正当性の解析は興味深い Hash を返す。全てのドキュメントが正しくない場合は例外があがる。
p admin.validate_collection('coll_name')
* 例
例については、mongo-ruby-driver examples directory を参照のこと。
The Mongo Tutorial は、Working with Mongo Objects and Classes in Ruby という特別なセクションを用意している。(このチュートリアルは、Mongo の包括的で有益な導入である)
* 参照
s mongodb-ruby-チュートリアル
f markdown
u 80458e93-6218-42cc-87eb-fb500e75985c