Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MongoDB + Ruby. How to access document properties?

Tags:

ruby

mongodb

bson

I want to try Mongo with Ruby. I connected, selected collection and I can query data from 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]]

But how to access propeties, when I retrieve BSON hash? I need something like this:

data.x
=> 4

to_hash method gives me the same BSON::OrderedHash... :(

like image 961
nkuhta Avatar asked Oct 08 '22 02:10

nkuhta


1 Answers

When you say coll.find_one({:x=>4}), you get a BSON::OrderedHash back that you access like a normal Hash:

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

If you use a full find instead of find_one, you get a MongoDB::Cursor which is an Enumerable so you can iterate it like any other collection; the cursor will return BSON::OrderedHash instances as you iterate so you can do things like this:

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

If you wanted objects instead of Hashes then you'd have to wrap the MongoDB::Cursor and BSON::OrderedHash instances with object yourself (possibly via Struct).

like image 104
mu is too short Avatar answered Oct 12 '22 13:10

mu is too short