2012-02-15 4 views
3

があった場合、私は今following-のmongo-rubyのドライバは、カスタム_id

id = "#{params[:id]}:#{Time.now.strftime("%y%m%d")}" 
# db.collection('metrics').insert({'_id' => id}) 
db.collection('metrics').update(
    { '_id' => id }, 
    { '$inc' => { "hits" => 1 } }, 
    { 'upsert' => true } 
) 

のようなものを使用してのmongo-rubyのドライバで文書をアップサートしたいアップサートに新しい文書を作成しません既存の文書のみを更新し、存在しない場合は作成しません。両方のアクションを実行する唯一の方法は、上のinsert()コマンドのコメントを外す場合です。

私はmongoコンソールを使用して、このupsertを(insert()の必要なしに)直接実行しようとすると、期待通りに動作します。

答えて

10

paramsには文字列の代わりにシンボルを使用する必要があります。このコードは機能します。

db.collection('metrics').update(
    { '_id' => id }, 
    { '$inc' => { "hits" => 1 } }, 
    { :upsert => true } 
) 

実際、ほとんどの場所でシンボルを使用できます。これも動作します:

db.collection(:metrics).update(
    { :_id => id }, 
    { :$inc => { :hits => 1 } }, 
    { :upsert => true } 
) 
関連する問題