我想用Ruby试试Mongo。我连接,选择了集合,我可以从MongoDB查询数据。
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?我需要这样的东西:
data.x
=> 4
to_hash 方法给了我相同的BSON :: OrderedHash ...... :(
答案 0 :(得分: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
而不是find_one
,则会获得一个MongoDB :: Cursor,它是一个Enumerable,因此您可以像任何其他集合一样迭代它;在您迭代时,光标将返回BSON :: OrderedHash实例,因此您可以执行以下操作:
cursor = coll.find(:thing => /stuff/)
cursor.each { |h| puts h['thing'] }
things = cursor.map { |h| h['thing'] }
如果你想要对象而不是Hashes,那么你必须自己用对象包装MongoDB :: Cursor和BSON :: OrderedHash实例(可能通过Struct)。
答案 1 :(得分: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"]