新しい pg hstore は素晴らしいですね
http://www.postgresql.org/docs/devel/static/hstore.html
しかし、MongoDB のようにアトミック インクリメントをサポートしていないようですか?
db.mycoll.update({mykey: myval}, {my_counter: {$inc: 1}})
PostgreSQL Hstore でこれを行うには?
新しい pg hstore は素晴らしいですね
http://www.postgresql.org/docs/devel/static/hstore.html
しかし、MongoDB のようにアトミック インクリメントをサポートしていないようですか?
db.mycoll.update({mykey: myval}, {my_counter: {$inc: 1}})
PostgreSQL Hstore でこれを行うには?
次の理由により、MongoDB には$inc
演算子が必要です。
c = c + 1
インターフェイスは、特別な演算子なしで表現できるほど豊富ではありません。c = c + 1
hstoresで表現するだけです。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 配列関数を使用します)が、上記は機能するはずです。