新的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('my_counter', ...) 和明确的 ::text 施放值,以确保PostgreSQL知道您想要的功能。最后,您将新的键值与原始Hstore相连 h || hstore(...) 更换旧值。

如果您不想一直使用这种令人讨厌的混乱,那么您可以将其包装一个简单的功能并说:

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

隐藏恶心。

我确定还有其他方法可以做(使用各种 从数组 也许功能),但是以上应该起作用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top