【问题标题】:MongoDB + Ruby. How to access document properties?MongoDB + 红宝石。如何访问文档属性?
【发布时间】:2019-03-16 01:45:41
【问题描述】:

我想用 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 哈希时如何访问属性?我需要这样的东西:

data.x
=> 4

to_hash 方法给了我相同的 BSON::OrderedHash... :(

【问题讨论】:

    标签: ruby mongodb bson


    【解决方案1】:

    当你说 coll.find_one({:x=&gt;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'] }
    

    如果您想要对象而不是哈希,那么您必须自己用对象包装 MongoDB::Cursor 和 BSON::OrderedHash 实例(可能通过 Struct)。

    【讨论】:

      【解决方案2】:

      mongodbfind_one方法返回hash对象,find方法返回游标对象。

      游标对象可以被迭代,然后可以在普通哈希中提取答案。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-18
        • 2010-09-06
        • 1970-01-01
        • 2016-03-23
        • 1970-01-01
        • 1970-01-01
        • 2017-04-01
        • 1970-01-01
        相关资源
        最近更新 更多