Mongo Ruby Driver #find()on Specified field Values

时间:2015-05-29 22:57:13

标签: ruby mongodb mongodb-query

  • Ruby:ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
  • RubyGem:mongo (2.0.4)

我需要帮助查询MongoDB数据库及其gem并更新相应的字段。

编辑:我正在尝试遍历Mongo数据库的文档,下拉这些文档中特定字段的值,然后在脚本中更新它们。

目标
  1. 在数据库中查询字段partner_id为“合作伙伴”且字段state为“已配置”的文档,并仅返回_id下的值config字段。

    • 在此之后,我将遍历每个文档,生成密码并更新另一个数据库。
  2. 使用新生成的密码将数据库更新到每个文档config字段。

  3. 我在我的智慧结束,因为我已经看到了大约六种不同的编写语法的方法,除非我已经知道如何做这些事情,否则文档几乎没有帮助。非常感谢任何帮助!

    #!/usr/bin/env ruby
    
    require 'json'
    require 'net/http'
    require 'mongo'
    
    # Fetch the addons database URI and connect.
    db_uri = ENV['DATABASE_URI']
    client = Mongo::Client.new(db_uri)
    
    # Connect to the needed collection and pull down each document to be looped over individually.
    # **Having trouble getting this to work. The result is just '= []' - don't know what I'm doing wrong.
    client[:collection].find("partner_id" => "partner", "state" => "provisioned", :fields => ["_id", "config"]).each {
    
      # Need something here to pull down the values from each document's '_id' and 'config' fields and assign them to variables.
      user_id =
      user_config =
      user_config = JSON.parse(user_config)
    
      # ...generating password and updating other database...
    
      # Convert the Hash of the user's new configuration into JSON, and update the original database with it.
      # Not sure if any of this is correct. When querying to check, the database doesn't seem to be updated.
      user_config = user_config.to_json
      client[:collection].update(
        {"_id" => user_id},
        {'$set' => {
          "config" => user_config
          }
        }
      )
    }
    end
    return
    

1 个答案:

答案 0 :(得分:4)

你找不到任何东西,因为:

:fields => ["_id", "config"]

find的参数不是指定您想要的字段,find只是将其视为要查找的第三个文档字段。您的文档可能没有名为field的字段,其值是这些字符串的数组,因此查询可以立即找不到任何内容。

如果您想限制查询,则需要使用projection

client[:collection].find("partner_id" => "partner", "state" => "provisioned")
                   .projection('_id' => 1, 'config' => 1)
                   .each { |doc| ... }

然后在each区块内doc将成为哈希,以便您可以说:

user_id     = doc['user_id']
user_config = doc['user_config']

如果我正确阅读您的代码,user_config应该是哈希,所以您可能不需要自己解析它。