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')、将其转换为整数并加一来进行增量。然后你建立一个单一的元素 hstorehstore('my_counter', ...)并在值上进行显式::text转换,以确保 PostgreSQL 知道你想要哪个函数。最后,您将新的键值连接到原始 hstore 上h || hstore(...)以替换旧值。

如果您不想一直使用那种有点讨厌的混乱,那么您可以将它包装一个简单的函数并说:

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

来隐藏肮脏。

我确信还有其他方法可以做到这一点(也许使用各种to/from 数组函数),但上面应该可以工作。

于 2013-11-08T03:01:44.137 回答