PostgreSQL hstore中的原子增量,如MongoDB中的$ inc

时间:2013-11-08 01:01:31

标签: postgresql increment hstore

新的pg hstore看起来很棒

http://www.postgresql.org/docs/devel/static/hstore.html

但似乎不像MongoDB那样支持原子增量?

db.mycoll.update({mykey: myval}, {my_counter: {$inc: 1}})

如何使用PostgreSQL Hstore执行此操作?

1 个答案:

答案 0 :(得分:6)

MongoDB需要$inc运算符,因为:

  1. 如果没有特定的低级别支持,MongoDB中的原子操作很困难。
  2. 界面不够丰富,无法在没有特殊操作符的情况下表达c = c + 1
  3. 你只需要用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函数),但上述方法应该有效。