Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL hstore中的原子级增量,如MongoDB中的$inc_Postgresql_Increment_Hstore - Fatal编程技术网

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

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对键和值都使

新的pg商店看起来棒极了

但它似乎不支持像MongoDB那样的原子级增量

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

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

MongoDB需要一个
$inc
操作员,因为:

  • 如果没有特定的底层支持,MongoDB中的原子操作是困难的
  • 界面不够丰富,无法在没有特殊运算符的情况下表达
    c=c+1
  • 你只需要用hstores来表达
    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()中提供了对非字符串值类型的支持。