2012-04-15 8 views
4

RubyでMongoを試してみたいです。私は接続し、コレクションを選択し、MongoDBからデータを問い合わせることができます。MongoDB + Ruby。ドキュメントのプロパティにアクセスするには?

irb(main):049:0> coll.find_one({:x=>4}) 
=> #<BSON::OrderedHash:0x3fdb33fdd59c {"_id"=>BSON::ObjectId('4f8ae4d7c0111ba6383cbe1b'), "x"=>4.0, "j"=>1.0}> 

irb(main):048:0> coll.find_one({:x=>4}).to_a 
=> [["_id", BSON::ObjectId('4f8ae4d7c0111ba6383cbe1b')], ["x", 4.0], ["j", 1.0]] 

しかし、私はBSONハッシュを取得するとき、propetiesにアクセスする方法?方法は私に同じBSON :: OrderedHash ...を与える

data.x 
=> 4 

to_hash :(

答えて

4

あなたがcoll.find_one({:x=>4})を言うとき、あなたはBSONを取得:: OrderedHashバック、あなたがアクセス:私はこのようなものが必要通常のハッシュのように:

h = coll.find_one(:x => 4) 
puts h['x'] 
# 4 comes out unless you didn't find anything. 

あなたの代わりにfind_oneのフルfindを使用する場合は、あなたが他のコレクションのようにそれを繰り返すことができるように可算であるMongoDBの::カーソルを取得;トンを彼はあなたがこのようなものを行うことができますので、繰り返すようBSON :: OrderedHashインスタンスを返しますカーソル:

cursor = coll.find(:thing => /stuff/) 
cursor.each { |h| puts h['thing'] } 
things = cursor.map { |h| h['thing'] } 

あなたの代わりにハッシュのオブジェクトを望んでいたなら、あなたはMongoDBの::カーソルとBSONを::ラップする必要があるだろうOrderedHashインスタンスはオブジェクトを持ちます(おそらくStruct経由)。

0

Mongodb find_oneメソッドは、ハッシュオブジェクトを返します。findメソッドは、カーソルオブジェクトを返します。

Cursorオブジェクトは反復処理が可能で、通常のハッシュで解答を抽出することができます。

require 'rubygems' 
require 'mongo' 
include Mongo 

client = MongoClient.new('localhost', 27017) 

db = client.db("mydb") 
coll = db.collection("testCollection") 

coll.insert({"name"=>"John","lastname"=>"Smith","phone"=>"12345678"}) 
coll.insert({"name"=>"Jane","lastname"=>"Fonda","phone"=>"87654321"}) 

cursor = coll.find({"phone"=>"87654321"}) 
answer = {} 
cursor.map { |h| answer = h } 
puts answer["name"] 
関連する問題