【发布时间】:2012-03-19 03:45:30
【问题描述】:
我有一个简单的 Ruby 脚本(没有 rails、sinatra 等),它使用 Mongo gem 将记录作为 Redis/Resque worker 的一部分插入到我的数据库中。
有时我不想进行新的插入,而是想更新现有记录上的计数器字段。我可以用 rails/mysql 轻松地做到这一点。使用 Mongodb 在纯 Ruby 中执行此操作的最快方法是什么?
谢谢,
埃德
【问题讨论】:
我有一个简单的 Ruby 脚本(没有 rails、sinatra 等),它使用 Mongo gem 将记录作为 Redis/Resque worker 的一部分插入到我的数据库中。
有时我不想进行新的插入,而是想更新现有记录上的计数器字段。我可以用 rails/mysql 轻松地做到这一点。使用 Mongodb 在纯 Ruby 中执行此操作的最快方法是什么?
谢谢,
埃德
【问题讨论】:
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 文档。
【讨论】:
update的选项。
$inc 代替findAndModify。
感谢 envu 的指导,我最终选择了 upsert。这是一个示例 sn-p,说明如何在 Ruby 客户端中使用它:
link_id = @globallinks.update(
{
":url" => "http://somevalue.com"
},
{
'$inc' => {":totalcount" => 1},
'$set' => {":timelastseen" => Time.now}
},
{
:upsert=>true
}
)
【讨论】: