2012-03-18 4 views
0

나는 Redis/Resque 작업자의 일원으로 내 DB에 레코드를 삽입하기 위해 Mongo gem을 사용하는 간단한 Ruby 스크립트 (레일, sinatra 등 없음)를 사용했습니다.Mongodb and Ruby gem - 레코드가 있는지 확인합니다.

경우에 따라 새로운 레코드를 삽입하는 대신 기존 레코드의 카운터 필드를 업데이트하고 싶습니다. 레일즈/mysql을 통해이 일을 충분히 할 수있다. Mongodb가있는 순수 루비에서이 작업을 수행하는 가장 빠른 방법은 무엇입니까?

감사합니다,

에드

답변

2

MongoDB를위한 루비 클라이언트 라이브러리는 매우 편리하고 사용하기 쉽습니다. 그래서, MongoDB의에서 문서를 업데이트이 유사한 사용 : 당신은뿐만 아니라 MongoDB의에서 manual for updating 문서를 체크 아웃 할 수 있습니다

#!/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) 

합니다.

+0

감사합니다. evnu - 이것은 카운터 업데이트를 완벽하게 처리합니다. 초기 .find nil 반환하는 경우 그냥 새 삽입 문을 입력 할 수 있습니다 같아요. –

+1

예, 또는 "upsert"를 사용할 수 있습니다.이 명령은 문서가 이미있는 경우에만 업데이트하거나 문서가없는 경우 삽입합니다. 매뉴얼은'update'에 전달해야만하는 옵션을 설명합니다. – evnu

+0

아 와우! 즉시 체크 아웃 할 것입니다! 감사! –

0

나는 envu의 지시 덕분에 결국 upsert와 함께 갔다. 여기에 Ruby 클라이언트를 사용하는 방법의 예가 있습니다 :

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