新的pg hstore看起来很棒
http://www.postgresql.org/docs/devel/static/hstore.html
但似乎不像MongoDB那样支持原子增量?
db.mycoll.update({mykey: myval}, {my_counter: {$inc: 1}})
如何使用PostgreSQL Hstore执行此操作?
答案 0 :(得分:6)
MongoDB需要$inc
运算符,因为:
c = c + 1
。你只需要用hstores表达c = c + 1
。这个任务很复杂,因为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', ...)
构建一个单独的元素hstore,并对该值进行显式::text
强制转换,以确保PostgreSQL知道您想要哪个函数。最后,使用h || hstore(...)
将新键值连接到原始hstore上以替换旧值。
如果你不想一直使用那种有点讨厌的混乱,那么你可以把它包装成一个简单的函数并说:
update t
set h = hstore_inc(h, 'my_counter', 1)
where ...
隐藏肮脏。
我确信还有其他方法可以做到(可能使用各种to/from array函数),但上述方法应该有效。