1

findAndModifyin mongodb は素晴らしいのですが、どの埋め込みドキュメントを変更したかを知るのに少し苦労しています。

Postこれは、 embeds_manyの例ですComments。(私は Mongoid ORM を使用していますが、質問はどの MongoDB セットアップにも共通です)。

begin
  p = Post.asc(id).where(comments: { '$elemMatch' => {reserved: false} }).find_and_modify({'$set' => {'comments.$.reserved' => true}}, {new: true}
  # now i need to find which comment I just reserved
  c = p.comments.select{|c| c.reserved }.first
  ...
ensure
  c.update_attribute :reserved, false
end

この種の作業はOKですが、これを同時に実行している複数のプロセスがある場合select、別のプロセスが予約したコメントを選択できます(競合状態)。

これは私が今持っている最も近いものです(プロセスIDで予約しています):

begin
  p = Post.asc(id).where(comments: { '$elemMatch' => {reserved: nil} }).find_and_modify({'$set' => {'comments.$.reserved' => Process.pid}}, {new: true}
  # now i need to find which comment I just reserved
  c = p.comments.select{|c| c.reserved == Process.pid }.first
  ...
ensure
  c.update_attribute :reserved, nil
end

これはうまくいくようです。これはこれを行うための最良の方法ですか、それともより良いパターンがありますか?

4

1 に答える 1

0

SecureRandom.hexを生成し、これを埋め込みドキュメントに設定することで解決できましたfind_and_modify。次に、埋め込まれたドキュメントをループして、一致する 16 進数を持つドキュメントを確認し、どのドキュメントを使用しているかを確認できます。

于 2013-02-25T23:30:50.063 に答える