Ruby mongoDBに接続してドキュメントを取得する
Rubyで、mongoDBに接続してドキュメントを取得するソースコードを記述してます。
環境
- OS windows11 home
- ruby ruby 3.0.3p157 (2021-11-24 revision 3fb7d2cadc) [x64-mingw32]
- gem 3.2.32
- mongoDB 5.2.0
- vscode 1.63.2
mongoインストール
ライブラリ「mongo」を使います。「gem」を使ってインストールしておきます。
gem install mongo
サンプルコード
localhostにある「mongoDB」に接続して、以下のDB「hoge」にあるコレクション「foo」のドキュメントを取得してみます。
ここでは「test.rb」という名前で作成してます。
require "mongo"
Mongo::Logger.logger.level = ::Logger::FATAL
begin
c = Mongo::Client.new(["127.0.0.1:27017"])
d = c.use("hoge")
d[:foo].find.each { |doc| puts doc }
rescue Mongo::Error::NoServerAvailable => e
p e
end
実行結果を確認すると、ドキュメントが取得されていることが確認できます。
> ruby test.rb
{"_id"=>BSON::ObjectId('61c58bf09d1a5be60905803e'), "name"=>"itiro", "age"=>10.0, "gender"=>"m"}
{"_id"=>BSON::ObjectId('61c58bf09d1a5be60905803f'), "name"=>"jiro", "age"=>20.0, "gender"=>"m"}
{"_id"=>BSON::ObjectId('61c58bf09d1a5be609058040'), "name"=>"saburo", "age"=>30.0, "gender"=>"m"}
{"_id"=>BSON::ObjectId('61c58bf09d1a5be609058041'), "name"=>"siro", "age"=>40.0, "gender"=>"f"}
{"_id"=>BSON::ObjectId('61c58bf09d1a5be609058042'), "name"=>"goro", "age"=>50.0, "gender"=>"x"}
{"_id"=>BSON::ObjectId('61c58bf09d1a5be609058043'), "name"=>"gonbe", "age"=>60.0, "gender"=>"x"}
{"_id"=>BSON::ObjectId('61c58bf09d1a5be609058044'), "name"=>"gonbe", "age"=>70.0, "gender"=>"x"}
{"_id"=>BSON::ObjectId('61c58bf09d1a5be609058045'), "name"=>"gonbe", "age"=>80.0, "gender"=>"x"}
{"_id"=>BSON::ObjectId('61c58bf09d1a5be609058046'), "name"=>"gonbe", "age"=>90.0, "gender"=>"x"}
{"_id"=>BSON::ObjectId('61c58bf19d1a5be609058047'), "name"=>"gonbe", "age"=>100.0, "gender"=>"x"}
{"_id"=>BSON::ObjectId('61c59d77070a9d799735b9c2'), "name"=>"itiro", "age"=>100, "gender"=>"m"}
{"_id"=>BSON::ObjectId('61c5a0d950ab91f99d9f8a78'), "name"=>"itiro", "age"=>100, "gender"=>"m"}
{"_id"=>BSON::ObjectId('61c5a0eea767684a37d6d936'), "name"=>"itiro", "age"=>100, "gender"=>"m"}
条件を指定
条件を指定して、取得することも可能です。「name」が「jiro」のものだけを取得してみます。
require "mongo"
Mongo::Logger.logger.level = ::Logger::FATAL
begin
c = Mongo::Client.new(["127.0.0.1:27017"])
d = c.use("hoge")
d[:foo].find(:name => 'jiro').each { |doc| puts doc }
rescue Mongo::Error::NoServerAvailable => e
p e
end
実行結果
> ruby test.rb
{"_id"=>BSON::ObjectId('61c58bf09d1a5be60905803f'), "name"=>"jiro", "age"=>20.0, "gender"=>"m"}
「age」が「50」未満のものだけも抽出してみます。
require "mongo"
Mongo::Logger.logger.level = ::Logger::FATAL
begin
c = Mongo::Client.new(["127.0.0.1:27017"])
d = c.use("hoge")
d[:foo].find("age" => {'$lt' => 50}).each { |doc| puts doc }
rescue Mongo::Error::NoServerAvailable => e
p e
end
実行結果
> ruby test.rb
{"_id"=>BSON::ObjectId('61c58bf09d1a5be60905803e'), "name"=>"itiro", "age"=>10.0, "gender"=>"m"}
{"_id"=>BSON::ObjectId('61c58bf09d1a5be60905803f'), "name"=>"jiro", "age"=>20.0, "gender"=>"m"}
{"_id"=>BSON::ObjectId('61c58bf09d1a5be609058040'), "name"=>"saburo", "age"=>30.0, "gender"=>"m"}
{"_id"=>BSON::ObjectId('61c58bf09d1a5be609058041'), "name"=>"siro", "age"=>40.0, "gender"=>"f"}
「or」を使用する場合は、以下となります。
require "mongo"
Mongo::Logger.logger.level = ::Logger::FATAL
begin
c = Mongo::Client.new(["127.0.0.1:27017"])
d = c.use("hoge")
d[:foo].find('$or' => [{:name => "gonbe"}, {:name => "itiro" }]).each { |doc| puts doc }
rescue Mongo::Error::NoServerAvailable => e
p e
end
実行結果
> ruby test.rb
{"_id"=>BSON::ObjectId('61c58bf09d1a5be60905803e'), "name"=>"itiro", "age"=>10.0, "gender"=>"m"}
{"_id"=>BSON::ObjectId('61c58bf09d1a5be609058043'), "name"=>"gonbe", "age"=>60.0, "gender"=>"x"}
{"_id"=>BSON::ObjectId('61c58bf09d1a5be609058044'), "name"=>"gonbe", "age"=>70.0, "gender"=>"x"}
{"_id"=>BSON::ObjectId('61c58bf09d1a5be609058045'), "name"=>"gonbe", "age"=>80.0, "gender"=>"x"}
{"_id"=>BSON::ObjectId('61c58bf09d1a5be609058046'), "name"=>"gonbe", "age"=>90.0, "gender"=>"x"}
{"_id"=>BSON::ObjectId('61c58bf19d1a5be609058047'), "name"=>"gonbe", "age"=>100.0, "gender"=>"x"}
{"_id"=>BSON::ObjectId('61c59d77070a9d799735b9c2'), "name"=>"itiro", "age"=>100, "gender"=>"m"}
{"_id"=>BSON::ObjectId('61c5a0d950ab91f99d9f8a78'), "name"=>"itiro", "age"=>100, "gender"=>"m"}
{"_id"=>BSON::ObjectId('61c5a0eea767684a37d6d936'), "name"=>"itiro", "age"=>100, "gender"=>"m"}
-
前の記事
Rust ベクタ(可変配列)の値が1つでも条件に一致するかを判定する 2023.03.24
-
次の記事
Dart 文字列を指定した数の空白を先頭に埋める 2023.03.25
コメントを書く