2012-03-18 38 views
0

我有一个简单的Ruby脚本(没有rails,sinatra等),它使用Mongo gem将记录作为Redis/Resque worker的一部分插入到我的数据库中。Mongodb和红宝石 - 检查是否存在记录

有时,而不是做一个新的插入我想更新现有记录上的计数器字段。我可以用rails/mysql来做到这一点。用Mongodb在纯Ruby中做这件事最快的方法是什么?

感谢,

埃德

回答

2

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文件以及。

+0

谢谢evnu - 这绝对会处理柜台更新 - 完美。我猜如果最初的.find返回零,我可以进入一个新的插入语句。 – 2012-03-18 18:20:36

+1

是的,或者您可以使用“upsert”,只有当文档已经存在或者文档丢失时才会更新。该手册解释了您必须传递给'update'的选项。 – evnu 2012-03-18 18:23:27

+0

啊upsert!将立即检查出来!谢谢! – 2012-03-18 18:29:28

0

感谢envu的指导我最后用upsert去了。这里是一个如何使用它的Ruby客户端的示例片段:

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