【问题标题】:how to use ruby's mongo driver to update a mult-level document如何使用ruby mongo驱动更新多级文档
【发布时间】:2014-09-25 19:12:20
【问题描述】:

如何使用 ruby​​ 的 mongo 驱动更新多级文档。例如,这里是文档的一部分:

...
"group_overrides": [
  {
    "additional_filesystem_gb": 0,
    "components": [
      {
        "comp": "jbosseap-6",
        "cart": "jbosseap-6",
        "cart_id": ObjectId("5423d363f4b25eea0b000021")
      }
    ],
    "max_gears": 1
  }
],

在 mongo-shell 中,我可以执行以下操作:

db.applications.update({name:"ulmuqhfv"}, {$set: {"group_overrides.0.additional_filesystem_gb": 1}})

并且文档将被更新。当我尝试以下操作时:

db.update('applications', {"app_name"=>"ulmuqhfv"}, {"$set"=>{"group_overrides.0.additional_filesystem_gb"=>1})

失败了。更新数组的正确语法是什么?

db 是围绕 ruby​​ mongo 驱动程序的包装类的一个实例。下面是更新方法的样子:

def update(c_name, selector, opts)
  db = @db.collection(c_name)
  if opts
    db.update(selector, opts).to_a
  else
    db.update(selector).to_a
  end
end

【问题讨论】:

  • Ruby 中的db 是什么? “失败”具体是什么意思?
  • db 只是一个包装器,它基本上是访问集合并调用 update()

标签: ruby mongodb driver


【解决方案1】:

就这么简单:

db['applications'].update({"app_name"=>"ulmuqhfv"}, {"$set"=>{"group_overrides.0.additional_filesystem_gb"=>1})

您需要在访问哈希键时访问您的集合,db['applications'] 将返回集合对象

mongo_connection = Mongo::Connection.new("localhost", 27017) # your connection settings
db = mongo_connection.db("mydb") # select database
coll = db['applications'] # select collection
coll.update({"app_name"=>"ulmuqhfv"}, {"$set"=>{"group_overrides.0.additional_filesystem_gb"=>1})

您可以在获取收​​藏部分了解更多here

【讨论】:

  • 我的 db 类已经选择了集合。我最终打电话给 collection.update() 就像你的回答一样。请注意,我的示例中的选择器和 opt 哈希与您建议的相同...
  • 不是根据您发布的代码。请将您的代码发布到您的数据库类中,并尝试直接使用它以更清晰
  • def update(c_name, selector, opts) db = @db.collection(c_name) if opts db.update(selector, opts).to_a else db.update(selector).to_a end end
  • 如我所说,直接尝试使用驱动,写出结果
  • 你的方法和我的结果是一样的。 {"updatedExisting"=>false, "n"=>0, "lastOp"=>seconds: 0, increment: 0, "connectionId"=>66, "err"=>nil, "ok"=>1.0}。 ..但文档没有更新。
猜你喜欢
  • 2023-03-25
  • 2011-04-04
  • 1970-01-01
  • 2021-11-02
  • 2015-11-18
  • 2011-12-17
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
相关资源
最近更新 更多