【问题标题】:Mongodb and Ruby gem - Check if record existsMongodb 和 Ruby gem - 检查记录是否存在
【发布时间】:2012-03-19 03:45:30
【问题描述】:

我有一个简单的 Ruby 脚本(没有 rails、sinatra 等),它使用 Mongo gem 将记录作为 Redis/Resque worker 的一部分插入到我的数据库中。

有时我不想进行新的插入,而是想更新现有记录上的计数器字段。我可以用 rails/mysql 轻松地做到这一点。使用 Mongodb 在纯 Ruby 中执行此操作的最快方法是什么?

谢谢,

埃德

【问题讨论】:

    标签: ruby mongodb


    【解决方案1】:

    MongoDB 的 Ruby 客户端库非常方便易用。因此,要更新 MongoDB 中的文档,请使用类似于以下内容的内容:

    #!/usr/bin/ruby
    require 'mongo'
    
    database = Mongo::Connection.new.db("yourdatabasename")
    
    # get the document
    x = database.find({"_id" => "12312132"})
    
    # change the document
    x["count"] = (x["count"] || 0) + 1
    
    # update it in mongodb
    database["collection"].update("_id" => "thecollectionid", x)
    

    您可能还想查看 MongoDB 中的 manual for updating 文档。

    【讨论】:

    • 感谢 evnu - 这肯定会处理计数器更新 - 完美。我想如果最初的 .find 返回 nil 我可以输入一个新的插入语句。
    • 是的,或者您可以使用“upsert”,它仅在文档已存在时更新或在文档丢失时插入。该手册解释了您必须传递给update的选项。
    • 如果两个进程同时尝试增加计数器,第二个可能会覆盖第一个。可能值得用$inc 代替findAndModify
    【解决方案2】:

    感谢 envu 的指导,我最终选择了 upsert。这是一个示例 sn-p,说明如何在 Ruby 客户端中使用它:

        link_id = @globallinks.update(
          {
            ":url" => "http://somevalue.com"
          }, 
          {
            '$inc' => {":totalcount" => 1},
            '$set' => {":timelastseen" => Time.now}
          }, 
          {
            :upsert=>true
          }
        )  
    

    【讨论】:

      猜你喜欢
      • 2013-05-29
      • 2010-12-17
      • 2011-02-20
      • 2021-06-01
      • 2015-01-21
      • 2012-08-13
      • 2015-01-02
      相关资源
      最近更新 更多