Ruby mongoDBに接続してドキュメントを取得する

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"}