我有一个简单的Ruby脚本(没有rails,sinatra等),它使用Mongo gem将记录作为Redis/Resque worker的一部分插入到我的数据库中。Mongodb和红宝石 - 检查是否存在记录
有时,而不是做一个新的插入我想更新现有记录上的计数器字段。我可以用rails/mysql来做到这一点。用Mongodb在纯Ruby中做这件事最快的方法是什么?
感谢,
埃德
我有一个简单的Ruby脚本(没有rails,sinatra等),它使用Mongo gem将记录作为Redis/Resque worker的一部分插入到我的数据库中。Mongodb和红宝石 - 检查是否存在记录
有时,而不是做一个新的插入我想更新现有记录上的计数器字段。我可以用rails/mysql来做到这一点。用Mongodb在纯Ruby中做这件事最快的方法是什么?
感谢,
埃德
MongoDB的红宝石客户端库是非常方便和易于使用。因此,更新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文件以及。
感谢envu的指导我最后用upsert去了。这里是一个如何使用它的Ruby客户端的示例片段:
link_id = @globallinks.update(
{
":url" => "http://somevalue.com"
},
{
'$inc' => {":totalcount" => 1},
'$set' => {":timelastseen" => Time.now}
},
{
:upsert=>true
}
)
谢谢evnu - 这绝对会处理柜台更新 - 完美。我猜如果最初的.find返回零,我可以进入一个新的插入语句。 – 2012-03-18 18:20:36
是的,或者您可以使用“upsert”,只有当文档已经存在或者文档丢失时才会更新。该手册解释了您必须传递给'update'的选项。 – evnu 2012-03-18 18:23:27
啊upsert!将立即检查出来!谢谢! – 2012-03-18 18:29:28