【问题标题】:save / update a (Moped) BSON::Document with ruby使用 ruby​​ 保存/更新(轻便摩托车)BSON::Document
【发布时间】:2015-08-15 04:19:21
【问题描述】:

我尝试了很多方法来更新现有的 bson 文档,但它在我的 mongodb 中从未改变:

col = db["collection"]
col.insert({"ben": 1})
doc = col.find().to_a.first
# => {"_id"=>BSON::ObjectId('556c7f1b167e70640070a4d9'), "ben"=>1}

第一次尝试更新:

doc.merge!({"ben": 5, "ams": 6})
col.find().to_a.first
# => {"_id"=>BSON::ObjectId('556c7f1b167e70640070a4d9'), "ben"=>1}

第二次尝试更新:

doc.update({"ben": 5, "ams": 6})
col.find().to_a.first
# => {"_id"=>BSON::ObjectId('556c7f1b167e70640070a4d9'), "ben"=>1}

第三次尝试...

doc["ben"] = 5
doc["ams"] = 6
doc.save
# NoMethodError: undefined method `save' for #<BSON::Document:0x00000003f284d0>

如您所见,以上方法都不适合我。我无法通过谷歌搜索找到任何其他建议。你知道如何更新我的文件吗?有可能吗?

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid moped


    【解决方案1】:

    只要你这样做:

    col.find().to_a
    #          ^^^^
    

    您正在处理一个简单的 Ruby 哈希数组,它与数据库没有连接。所以当你说:

    doc.update({"ben": 5, "ams": 6})
    

    你打电话给Hash#update。如果你想更新一些东西,你可以在find 返回的内容上调用update

    col.find.update(:$set => { 'ben' => 5, 'ams' => 6 })
    

    或者如果你想替换整个文档:

    col.find.update('ben' => 5, 'ams' => 6)
    

    当然,您通常会告诉find 您想要哪个特定文档。

    请注意,update 仅更新它找到的第一个匹配文档,如果您想更新所有匹配文档,则可以使用 update_all

    【讨论】:

    • 您好,您的观点很明确。谢谢!这是否意味着我无法在迭代期间更新文档? (例如:col.find().each { |d| d.update("ben": 5, "ams": 6) }
    • 对,这行不通,因为d 将只是each 块内的简单哈希。您需要在迭代中使用col.find(:_id =&gt; ...).update(...)。通常你会使用 Mongoid 实例来处理所有这些,Moped 通常只在你想直接与数据库对话时使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多