新的 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'
)、将其转换为整数并加一来进行增量。然后你建立一个单一的元素 hstorehstore('my_counter', ...)
并在值上进行显式::text
转换,以确保 PostgreSQL 知道你想要哪个函数。最后,您将新的键值连接到原始 hstore 上h || hstore(...)
以替换旧值。
如果您不想一直使用那种有点讨厌的混乱,那么您可以将它包装一个简单的函数并说:
update t
set h = hstore_inc(h, 'my_counter', 1)
where ...
来隐藏肮脏。
我确信还有其他方法可以做到这一点(也许使用各种to/from 数组函数),但上面应该可以工作。