質問

新しい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 オペレーターの理由:

  1. MongoDBの原子操作は、特定の低レベルのサポートがなければ困難です。
  2. インターフェイスは、表現するのに十分リッチではありません c = c + 1 特別なオペレーターなし。

あなたはただ表現する必要があります c = c + 1 hstoresで。 hstoresはキーと値の両方に文字列を使用し、キャストの混乱が残るため、このタスクは少し複雑です。私はあなたがこのような厄介な何かに固執していると思います:

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')、整数にキャストし、それを追加します。次に、単一の要素hstoreを構築します hstore('my_counter', ...) そして明示的な ::text 値をキャストして、PostgreSQLが必要な関数を知っていることを確認します。最後に、新しいキー価値を元のhstoreに連結します h || hstore(...) 古い値を置き換える。

あなたがいつもそれをやや厄介な混乱を使いたくないなら、あなたはそれを単純な機能と包んで言うことができます:

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

厄介さを隠すために。

私はそれをする他の方法があると確信しています(さまざまなものを使用して アレイへ/から おそらく関数)しかし、上記は機能するはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top