0

私は単純な選択と更新のロジックに問題があります:

task = Task.queueing.where(conditions).order(:created_at.asc).first
if task
  task.set(:status=>2)
end

それは簡単ですよね?

しかし、問題は次のとおりです。同時に来る100以上のリクエストがあります。非常に多くのクライアントが同じレコードを取得しましたが、それは私が望んでいないことです。

mysql では、重複したロードを避けるために次のようなことができます。

rnd_str = 10000000 * rand
Task.update(status:rnd_str).limit(1) # this may be wrong code
task = Task.where(status:rnd_str).first
task.set(status:2)
render :json=>task

しかし、mongomapper でクエリを使用して 1 つのレコードを更新する方法は?

どうも !

4

1 に答える 1

0

MongoDB の更新では、デフォルトで 1 つのレコードのみが更新されます。オプションを使用して、クエリ内の一致するすべてのドキュメントを更新するオプション{multi:true}がありますが、デフォルトでは、更新では1 つのドキュメントのみが更新されます。

したがって、「クエリ」を更新ステートメントに結合して、(SQL で行うのと同じように) アトミックに実行し、2 つの別々の操作を行わないようにする必要があります。シェル構文では、次のようになります。

   db.queueing.update({conditions}, {$set:{status:2}})

ここで、作業するために更新したタスク ドキュメントも必要な場合は、findAndModifyを使用して、1 回のアトミック操作でドキュメントを更新して返すことができます。このような:

   task = db.queueing.findAndModify( {your-condition}, 
                                     sort: { your-ordering },
                                     update: { $set: { status: 2 } }
          } );
于 2013-06-04T15:05:32.983 に答える