PostgreSQL hstore中的原子级增量,如MongoDB中的$inc
新的pg商店看起来棒极了 但它似乎不支持像MongoDB那样的原子级增量PostgreSQL hstore中的原子级增量,如MongoDB中的$inc,postgresql,increment,hstore,Postgresql,Increment,Hstore,新的pg商店看起来棒极了 但它似乎不支持像MongoDB那样的原子级增量 db.mycoll.update({mykey: myval}, {my_counter: {$inc: 1}}) 如何使用PostgreSQL Hstore执行此操作?MongoDB需要一个$inc操作员,因为: 如果没有特定的底层支持,MongoDB中的原子操作是困难的 界面不够丰富,无法在没有特殊运算符的情况下表达c=c+1 你只需要用hstores来表达c=c+1。这个任务有点复杂,因为hstore对键和值都使
db.mycoll.update({mykey: myval}, {my_counter: {$inc: 1}})
如何使用PostgreSQL Hstore执行此操作?MongoDB需要一个
$inc
操作员,因为:
c=c+1
c=c+1
。这个任务有点复杂,因为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'
),将其强制转换为整数,然后向其中添加一个值来执行增量。然后用hstore('my_counter',…)
和显式的::text
对值进行强制转换,以确保PostgreSQL知道需要哪个函数。最后,使用h | | hstore(…)
将新键值连接到原始hstore上,以替换旧值
如果您不想一直使用这种令人讨厌的混乱,那么您可以将其包装为一个简单的函数,并说:
update t
set h = hstore_inc(h, 'my_counter', 1)
where ...
掩盖肮脏
我相信还有其他方法可以做到这一点(也许可以使用各种函数),但上面的方法应该可以做到。hs更新版本pg中的存储不再是字符串,它具有本机类型,可以像JSON一样嵌套@est:从哪个PostgreSQL版本开始?9.3文档仍然说“键和值只是文本字符串。”并且所有函数都与
text
和text[]
@muistooshort一起工作。你说得对。9.4()中提供了对非字符串值类型的支持。