1

RethinkDB github でいくつかの SO の質問と問題を見た後、アトミック Upsert が可能かどうか明確な結論に達することができませんでしたか?

基本的にZINCRBYと同じ操作をRedisで行いたいと考えています。

メンバーがソートされたセットに存在しない場合、そのスコアとしてインクリメントで追加されます (以前のスコアが 0.0 であったかのように)。key が存在しない場合は、指定されたメンバーを唯一のメンバーとする新しいソート済みセットが作成されます。

現在の実装は、私が使用したほとんどすべてのデータベースとは異なるようです。データが更新されずに置換または挿入されます。これは、最後の訪問の更新、クリック数の更新、製品数量の更新などの単純な使用例です。したがって、これを行う簡単な方法が見当たらないため、非常に明白な何かが欠けているに違いありません。

4

2 に答える 2

1

はい、可能です。キーの後get、アトミックを実行しますreplace。このようなものがうまくいくかもしれません:

function set_or_increment_score(player, points){
  return r.table('scores').get(player).replace(
    row =>
      { id: player,
        score: r.branch(
                 row.eq(null),
                 points,
                 row('score').add(points))
      });
}

次の動作があります。

> set_or_increment_score("alice", 1).run(conn)
{ inserted: 1 }
> set_or_increment_score("alice", 2).run(conn)
{ replaced: 1 }

ドキュメントが存在しないときにget返され、存在しないドキュメントの a が挿入に変換されるため、機能します。置換のドキュメントを参照してくださいnullreplace

于 2016-11-01T20:04:45.587 に答える
0

したがって、更新なしの問題を回避するために、次のコードを使用することになります。

r.db("test").table("t").insert(
  {id:"A", type:"player", species:"warrior", score:0, xp:0, armor:0},
  {conflict: function(id, oldDoc, newDoc) {
       return newDoc.merge(oldDoc).merge(
         {armor: oldDoc("armor").add(1)});
   }
  }
)

これはより読みやすくエレガントだと思いますか、それともサンプルと比較してコードに問題はありますか?

于 2016-11-03T11:54:03.737 に答える