4

新しい pg hstore は素晴らしいですね

http://www.postgresql.org/docs/devel/static/hstore.html

しかし、MongoDB のようにアトミック インクリメントをサポートしていないようですか?

db.mycoll.update({mykey: myval}, {my_counter: {$inc: 1}})

PostgreSQL Hstore でこれを行うには?

4

1 に答える 1

7

次の理由により、MongoDB には$inc演算子が必要です。

  1. MongoDB でのアトミック操作は、特定の低レベル サポートなしでは困難です。
  2. c = c + 1インターフェイスは、特別な演算子なしで表現できるほど豊富ではありません。

c = c + 1hstoresで表現するだけです。hstore はキーと値の両方に文字列を使用するため、このタスクは少し複雑であり、キャストの混乱が生じます。私はあなたがこのような厄介なもので立ち往生していると思います:

update t
set h = h || hstore('my_counter', ((h -> 'my_counter')::integer + 1)::text)
where mykey = myval

(h -> 'my_counter')::integer + 1、値 ( h -> 'my_counter') を抽出し、それを整数にキャストし、それに 1 を加算することによってインクリメントを行います。次に、PostgreSQL が必要な関数を確実に認識できるように、単一要素の hstore と値hstore('my_counter', ...)の明示的な::textキャストを作成します。最後に、新しいキー値を元の hstore に連結しh || hstore(...)て、古い値を置き換えます。

そのやや厄介な混乱を常に使用したくない場合は、単純な関数でラップして、次のように言うことができます。

update t
set h = hstore_inc(h, 'my_counter', 1)
where ...

意地悪を隠すために。

それを行うには他の方法があると確信しています(おそらくさまざまなto/from 配列関数を使用します)が、上記は機能するはずです。

于 2013-11-08T03:01:44.137 に答える