2012-04-15 6 views
4

Je veux essayer Mongo avec Ruby. J'ai connecté, sélectionné la collection et je peux interroger les données de MongoDB.MongoDB + Ruby. Comment accéder aux propriétés du document?

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]] 

Mais comment accéder aux propriétés, quand je récupère le hachage BSON? Je besoin de quelque chose comme ceci:

data.x 
=> 4 

to_hash méthode me donne la même BSON :: OrderedHash ... :(

Répondre

4

Quand vous dites coll.find_one({:x=>4}), vous obtenez un BSON :: OrderedHash retour que vous accès comme un Hash normal:

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

Si vous utilisez une pleine find au lieu de find_one, vous obtenez un MongoDB :: curseur qui est un Enumerable afin que vous puissiez itérer comme toute autre collection; t il curseur retournera BSON :: instances de OrderedHash que vous afin que vous puissiez itérer faire des choses comme ceci:

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

Si vous vouliez des objets au lieu de Hashes alors vous auriez à envelopper le MongoDB :: curseur et BSON :: OrderedHash instances avec objet vous-même (éventuellement via Struct).

0

La méthode Mongodb find_one renvoie l'objet de hachage, la méthode find renvoie l'objet cursor.

L'objet curseur peut être itéré, puis il est possible d'extraire la réponse dans un hachage normal.

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"] 
Questions connexes