如何在PostgreSQL中更新jsonb列的字段?
如何在PostgreSQL中更新jsonb列的字段?
在PostgreSQL中,jsonb类型是用来存储整个文档的。如果更改文档的任何部分,您需要为该列分配一个新值。由于Postgres会保留旧版本一段时间,所以这是一个昂贵的操作。
考虑到这一点,下面是一个不正确的更新jsonb列的示例:
create table t1 (doc jsonb); insert into t1 values ('{"param1": 10, "param2": 15}'), ('{"param1": 10, "param2": 5}'); update t1 set doc = ('{"param1": ' || ((doc->'param1')::text::int + 10)::text || ', "param2": ' || (doc->'param2')::text || '}')::jsonb where (doc->'param2')::text::int > 12; select * from t1;
运行上述代码后,输出结果如下:
doc ------------------------------ {"param1": 10, "param2": 5} {"param1": 20, "param2": 15} (2 rows)
我尝试了您的方法。性能相当糟糕。比起我在mongodb + 应用层的做法要差。除非jsonb有比上述方法更好的修改技术,否则我不会在我的应用程序中使用它。无论如何,感谢您的回答。
使用字符串连接来修改jsonb似乎是一个非常糟糕的想法。此外,在当前的PostgreSQL版本中,可以使用"->>"操作符,无需进行文本转换。
根据以上的内容整理得出以下结论:
问题的原因是在更新jsonb列的字段时使用了字符串拼接的方法。这种方法的性能较差,不如使用mongodb + 应用层的方法。在当前版本的PostgreSQL中,可以使用"->>"操作符来修改jsonb,而不需要进行文本转换。
问题出现的原因是,用户想要更新一个PostgreSQL数据库中的jsonb列的字段。用户想要根据特定条件更新jsonb列中的字段值。
解决方法是使用PostgreSQL 9.5中的jsonb_set函数来更新jsonb列的字段。首先,用户需要创建一个包含jsonb列的表,并插入一些数据作为示例。然后,用户可以使用UPDATE语句和jsonb_set函数来更新jsonb列的字段值。在UPDATE语句中,用户需要指定要更新的表和jsonb_set函数的参数。jsonb_set函数的第一个参数是要更新的jsonb列,第二个参数是要更新的字段的路径,第三个参数是要设置的新值。在这个例子中,用户想要将jsonb列中的"param1"字段的值增加10。为了实现这一点,用户需要首先从jsonb列中获取"param1"字段的值,然后将其转换为实数并加上10,最后将结果转换为文本并再次转换为jsonb。用户还需要使用WHERE子句来指定更新的条件。
最后,用户可以使用SELECT语句来验证jsonb列的更新结果。在这个例子中,用户可以看到jsonb列中的"param1"字段的值已经增加了10。
通过使用以上方法,用户可以更新PostgreSQL数据库中jsonb列的字段值。这是一个简单而有效的方法来处理这个问题。