Postgresql:如何在jsonb字段上增加1

Postgresql:如何在jsonb字段上增加1,postgresql,jsonb,Postgresql,Jsonb,在Postgresql9.6中,有一个表包含一列datajsonb,它有一个count字段。 如何在单个sql中将数据->>计数增加1?就像mongodb的$inc。这很难看,但很有效。我现在只是通过阅读来弄明白这一点,所以很可能有更好的方法 让我们从一个简单的表开始: create table table1 (data jsonb); 插入一些JSON: insert into table1 (data) values ('{"name": "example", "count": 0}');

Postgresql
9.6中,有一个表包含一列
datajsonb
,它有一个
count
字段。

如何在单个sql中将
数据->>计数增加1?就像mongodb的
$inc

这很难看,但很有效。我现在只是通过阅读来弄明白这一点,所以很可能有更好的方法

让我们从一个简单的表开始:

create table table1 (data jsonb);
插入一些JSON:

insert into table1 (data) values ('{"name": "example", "count": 0}');
现在,我们要更新
data
列中
count
键的值。假设您有pg 9.5或更高版本,您可以使用concatenation操作符合并两个json(或jsonb)字典,如下所示:

sandbox=# select data || '{"count": 1}' as data from table1;
              data               
---------------------------------
 {"name": "example", "count": 1}
所以我们知道如何更新JSON密钥。但在上面的例子中,我在替换中使用了一个静态值,而实际上我们希望“比当前的count值多一个”。我们可以使用字符串连接来构建必要的JSON:

sandbox=# select '{"count": ' || ((data->>'count')::int + 1) || '}' as count from table1;
    count     
--------------
 {"count": 1}
综上所述:

sandbox=# update table1 set data = data || ('{"count": ' || ((data->>'count')::int + 1) || '}')::jsonb ;
UPDATE 1
这让我们:

sandbox=# select * from table1;
              data               
---------------------------------
 {"name": "example", "count": 1}

这是可行的,但它替换了整个
数据
,想知道在pg中是否有类似于mongodb的
$inc
的东西,或者它在mongodb的引擎盖下实际上是相同的(替换整个文档)?