GVKun编程网logo

如何在 Postgres 9.4 中对 JSONB 类型的列执行更新操作(postjson数据)

14

在这篇文章中,我们将带领您了解如何在Postgres9.4中对JSONB类型的列执行更新操作的全貌,包括postjson数据的相关情况。同时,我们还将为您介绍有关Postgresql9.4JSONB类

在这篇文章中,我们将带领您了解如何在 Postgres 9.4 中对 JSONB 类型的列执行更新操作的全貌,包括postjson数据的相关情况。同时,我们还将为您介绍有关Postgresql 9.4 JSONB类型,按日期范围选择、PostgreSQL 9.4 RC1 发布,JSONB 数据类型、postgreSql jsonb 类型、postgresql – postgres jsonb_set多个密钥更新的知识,以帮助您更好地理解这个主题。

本文目录一览:

如何在 Postgres 9.4 中对 JSONB 类型的列执行更新操作(postjson数据)

如何在 Postgres 9.4 中对 JSONB 类型的列执行更新操作(postjson数据)

查看 Postgres 9.4 数据类型 JSONB 的文档,对我来说如何对 JSONB 列进行更新并不是很明显。

JSONB 类型和函数的文档:

http://www.postgresql.org/docs/9.4/static/functions-json.htmlhttp://www.postgresql.org/docs/9.4/static/datatype-
json.html

例如,我有这个基本的表结构:

CREATE TABLE test(id serial, data jsonb);

插入很容易,如下所示:

INSERT INTO test(data) values (''{"name": "my-name", "tags": ["tag1", "tag2"]}'');

现在,我将如何更新“数据”列?这是无效的语法:

UPDATE test SET data->''name'' = ''my-other-name'' WHERE id = 1;

这是否记录在我错过的明显地方?谢谢。

答案1

小编典典

理想情况下,不要将 JSON 文档用于要在关系数据库中操作的结构化常规数据。请改用 规范化关系设计

JSON 主要用于存储不需要在 RDBMS 中操作的整个文档。有关的:

  • 带索引的 JSONB 与 hstore

在 Postgres 中更新一行总是写入 行的新版本。这就是Postgres 的 MVCC
模型的基本原理。从性能的角度来看,您是更改 JSON 对象中的单个数据还是更改所有数据都无关紧要:必须编写行的新版本。

因此手册中的建议:

当存储在表中时,JSON 数据与任何其他数据类型一样受到相同的并发控制注意事项。尽管存储大文档是可行的,但请记住,任何更新都会获取整行的行级锁。考虑将
JSON 文档限制在可管理的大小,以减少更新事务之间的锁争用。理想情况下,每个 JSON
文档都应该代表一个原子数据,业务规则规定不能合理地进一步细分为可以独立修改的较小数据。

它的要点:要修改JSON 对象中的 任何内容 ,您必须将修改后的对象分配给列。json除了存储能力之外,Postgres
还提供了有限的方法来构建和操作数据。自 9.2 版以来,随着每个新版本的发布,工具库都大幅增加。但是原则仍然存在:您 总是
必须将一个完整的修改对象分配给列,并且 Postgres 总是为任何更新写入一个新的行版本。

如何使用 Postgres 9.3 或更高版本的工具的一些技巧:

  • 如何修改新 PostgreSQL JSON 数据类型中的字段?

Postgresql 9.4 JSONB类型,按日期范围选择

Postgresql 9.4 JSONB类型,按日期范围选择

我正在从 Mongodb迁移,看看如何使用jsonb类型按范围选择,我每天有~2.880.000记录,我需要按站和日期字段查询数据库,我知道如何按时间范围选择
SELECT * FROM stations WHERE date >= '2014-02-01' AND date <  '2014-03-01 AND station = 'AA01'

但我不知道如何使用JSONB数据类型查询数据库.

CREATE TABLE stations (
  id SERIAL PRIMARY KEY,event JSONB
);

INSERT INTO test(event) VALUES('{"station":"AA01","value":2.31,"date":"2015-01-23 18:02:48.906569865 +0000 UTC"}');
INSERT INTO test(event) VALUES('{"station":"AA02","value":4.1,"date":"2015-01-23 19:02:48.906569865 +0000 UTC"}');

另外,我想知道如何获得良好的性能方法,谢谢.

SELECT *
FROM stations
WHERE to_date(event->>'date','YYYY-MM-DD') 
    BETWEEN '2014-02-01' 
    AND     '2014-03-01'
AND event->>'station' = 'AA01';

PostgreSQL 9.4 RC1 发布,JSONB 数据类型

PostgreSQL 9.4 RC1 发布,JSONB 数据类型

PostgreSQL 9.4 RC1 发布,此版本现已提供下载,文档请前往这里查看。

主要更新内容请看:

  • Allow materialized views to be refreshed without blocking reads

  • Add support for logical decoding of WAL data, to allow database changes to be streamed out in a customizable format

  • Allow background worker processes to be dynamically registered, started and terminated

  • Add jsonb, a more capable and efficient data type for storingJSONdata

  • Add newSQLcommand ALTER SYSTEM for updating postgresql.conf configuration file entries

  • Reduce lock strength for some ALTER TABLE commands

更多内容请看:Postgres 9.4 重要特性:jsonb 数据类型

完整改进内容请看发行说明,其他描述或者最新特性请看 9.4 Features Wiki Page。

PostgreSQL 依赖于社区帮忙测试下一个版本,保证其高性能的特性。更多测试相关信息请看这里。

postgreSql jsonb 类型

postgreSql jsonb 类型

JAVA 对应实体类型 为Object,在返回此值时,会将此值生成一个JSON 数据,自动生成 {"type":jsonb,"value":{数据}} 如果不想要此格式,在实体get方法里 public Object getIdPayRule() { if(null!=data){ return JSONObject.parse(String.valueOf(data)); } return data; } 用了postgresql,在做插入时,一定要掌握数据类型转义操作符 :: 如 insert into t1(id,json,jsonb) values(1,'{"bar": "baz","balance": 7.77,"active":false}'::json,"active":false}'::jsonb)

postgresql – postgres jsonb_set多个密钥更新

postgresql – postgres jsonb_set多个密钥更新

我有DB表和jsonb列.
number  | data
    1   | {"name": "firstName","city": "toronto","province": "ON"}

我需要一种更新数据列的方法.
所以我的输出应该是这样的:

{"name": "firstName","city": "ottawa","province": "ON","phone": "phonenum","prefix": "prefixedname"}

json_set可以吗?
我添加了如下查询:

update table_name set data = jsonb_set(data,'{city}','"ottawa"') where number = 1;

但是,我需要一种方法来添加新的键值(如果它不存在)并更新键值(如果它存在).是否可以在单个查询中实现此目的?

documentation says:

The || operator concatenates the elements at the top level of each of its operands. … For example,if both operands are objects with a common key field name,the value of the field in the result will just be the value from the right hand operand.

所以使用你的示例数据:

update table_name set
  data = data || '{"city": "ottawa","prefix": "prefixedname"}'
where number = 1;

此外,如果您要编辑的对象不在顶层 – 只需组合连接和jsonb_@R_400_5301@.例如,如果原始数据看起来像

{"location": {"name": "firstName","province": "ON"}}

然后

...
data = jsonb_set(data,'{location}',data->'location' || '{"city": "ottawa","prefix": "prefixedname"}')
...

我们今天的关于如何在 Postgres 9.4 中对 JSONB 类型的列执行更新操作postjson数据的分享就到这里,谢谢您的阅读,如果想了解更多关于Postgresql 9.4 JSONB类型,按日期范围选择、PostgreSQL 9.4 RC1 发布,JSONB 数据类型、postgreSql jsonb 类型、postgresql – postgres jsonb_set多个密钥更新的相关信息,可以在本站进行搜索。

本文标签: