1

望ましい動作:

Clojure のエージェントの実装では、エージェントを更新するために新しい値を送信しません。古い値で呼び出される関数を送信すると、戻り値がエージェントの新しい値として設定されます。

これにより、特定のことが簡単になります。たとえば、キュ​​ーがあり、キューに追加する 2 つの同時スレッドがある場合 (追加する順序は気にしません)、各スレッドは ( fn [x] (cons x new_value)) ...そしてそれはうまくいきます。一方、値で更新している場合は、ある種の比較と交換を行う必要があります。

質問:

このタイプの更新をサポートするデータベースはありますか? たとえば、私は最近 MongoDB を見ていました。ただし、MongoDB は $inc/$dec のみをサポートしており、ドキュメントを更新するための任意の関数はサポートしていません。

ありがとう!

PS -- トランザクションは必要ありません / ACID / BASE / ... 私が本当に欲しいのは、値ではなく関数による更新をサポートする単純なドキュメント ストアだけです。

4

1 に答える 1

0

MongoDB は実際には複数の異なる修飾子操作 (完全なリストはこちら) をサポートしており、$inc/$dec だけでは制限がある可能性があることがわかりますが、キューに追加する特定の例の単純な変形は、$push または $addToSet ( $addToSet は値がまだ存在しない場合にのみ値を追加するため、重複をキューに表示するかどうかによって異なります)。

より複雑なケース (コンペア アンド スワップ タイプのセマンティクスをサポートする) では、ニーズに正確に適合する単純なものが見つからない場合は、MongoDBのfindAndModify コマンドを調べることができます。

于 2012-05-02T10:27:46.753 に答える