Postgresql——jsonb类型
Postgresql Json
最近有个功能,需要用到 NoSQL 数据库。但是又不想因为这个小小的功能给系统增加一个 MongoDB 数据库,于是就想到了 Postgresql 支持 JSON 类型的数据格式,可以用来实现类似 NoSQL 数据库的功能。于是研究了一下。
版本说明:
Postgresql Version : 12
Linux Virtual Machine: Ubuntu 22.04 4G 2Cpu
数据类型
JSON 和 JSONB 区别
Postgresql 从 9.2 版本开始支持 json 数据类型,从 9.4 开始支持 jsonb 数据类型。
区别:
json类型是将整个json字符进行完成保存,包括空格、重复的键、和键的顺序等。jsonb类型会对json字符进行解析后保存二进制,解析的时候会删除不必要的空格和重复的键等。
由于上面的区别,所以在储存的时候 json 会比 jsonb 快,毕竟少了一个解析的步骤。但是在查询的时候 json 会比 jsonb 慢。
由于 jsonb 是格式化后的数据,所以他能使用的函数比 json 多很多,jsonb 甚至能使用索引。(具体使用哪种类型就要根据具体的业务场景了)
注意:这两者在储存的时候,字符串都要符合json规范,要不会储存失败。
JSON 和 JSONB 测试
创建一个表格,实验一下。
-- 创建一个 json_test_table 表
-- json_data 是 josn 类型
-- jsonb_data 是 jsonb 类型
CREATE TABLE "json_test_table" (
"id" int4 PRIMARY KEY,
"json_data" json,
"jsonb_data" jsonb
)
向表里插入一条数据
-- 这里注意一下两个 json 对象都有一个相同的键'name'。
INSERT INTO
json_test_table(id,json_data,jsonb_data)
VALUES(
1,
'{
"name":"zhangsan",
"name":"zhangsan",
"age":18,
"isBoy":true
}
'::json,
'
{
"name":"lisi",
"name":"lisi1",
"age":22,
"isBoy":false
}
'::jsonb
)
把刚才的数据查出来
SELECT * FROM json_test_table
id | json_data | jsonb_data
--------------------------------------------------------------------------------------------------------------
1 | {"name":"zhangsan","name":"zhangsan","age":18,"isBoy":true } | {"age": 22, "name": "lisi1", "isBoy": false}
查询结果中 jsonb_data 中只保留了一个 name 并且键的顺序也改变了(这里没体现出来json_data也保留了空格等字符,可以自己写个sql测一下)。
使用 JSONB 类型
由于本次功能读多写少,所以这里主要研究一下 jsonb 的增删改查的功能,其实 josn 类型也差不多。
增加
新增一条 josnb_data 就使用普通的 insert sql 就行。
INSERT INTO
json_test_table(id,jsonb_data)
VALUES(
2,
'
{
"name":"lisi",
"age":22,
"isBoy":false
}
'
)
上面我们在表中新增了行数据,现在再往 jsonb_data 中再新增一个键 "address_path" 他是一个字符串数组,值为 ["中国","江苏"]。
-- 其实这里只是调用 jsonb_set 方法把 jsonb 修改后,一个 UPDATE 操作把数据更新了。
UPDATE
json_test_table
SET
jsonb_data = jsonb_set(jsonb_data, '{address_path}', '["中国","江苏"]')
WHERE
id = 2
更新后数据变成了
id | jsonb_data
--------------------------------------------------------------------------------------------------------------
1 | {"age": 22, "name": "lisi", "isBoy": false, "address_path": ["中国", "江苏"]}
jsonb_set ( target, path, new_value [, create_if_missing ] )
- target:需要修改的json数据。
- path:要修改的值的路径。如果target是数组'{0,a}'表示在下标是0的位置更新a属性,如果是对象,则写'{a}'则会修改"a"键的内容。
- create_if_missing:当不存在 path 指定的键是否新建一个,默认是 true。
本质上对 jsonb 的增删改等操作就是 UPDATE 语句把表中的原数据更新掉。只是对 jsonb 对象的修改交给了数据库,这样压力就给到数据库服务。你完全可以把整条数据查出来,然后用业务逻辑处理后再调用 UPDATE 回去,但是这样压力就到了业务服务上,而且每次数据传输也会消耗时间。
除了使用上面的 jsonb_set 也可以使用 || 操作符。
UPDATE
json_test_table
SET
jsonb_data = jsonb_data || '{"address_path":["中国","江苏"]}'
WHERE
id = 2
查找
查找某个键的值
如果我们不想把整个 jsonb_data 都查出来,只想查找其中某几个键值。
SELECT jsonb_data::json ->> 'name',jsonb_data::json ->> 'age' as ageFROM json_test_table WHERE id = 2
返回
name | age |
------------
lisi | 22 |
如果是数组的对象应该怎么查呢?
我们在添加一列用于测试数组
id | jsonb_arr_data
--------------------------------------------------------------------------------------------------------------
2 | [{"id": 1, "value": "value1"}, {"id": 2, "value": "value2"}, {"id": 3, "value": "value3"}]
先来看一下一个方法 jsonb_array_elements 。他的作用就是 JSON数组展开为一组JSON值.
SELECT jsonb_array_elements(jsonb_arr_data) FROM json_test_table WHERE id = 2
jsonb_array_elements |
----------------------------
{"id": 1, "value": "value1"}|
{"id": 2, "value": "value2"}|
{"id": 3, "value": "value3"}|
所以只想查出 id 是 1 的值可以这么写
SELECT D FROM json_test_table T,jsonb_array_elements(jsonb_arr_data) D WHERE id = 2 AND D::json ->> 'id' = '1'
d |
----------------------------
{"id": 1, "value": "value1"}|
所以只想查出 id 是 1 和 2 的值可以这么写
SELECT D FROM json_test_table T,jsonb_array_elements(jsonb_arr_data) D WHERE id = 2 AND D::json ->> 'id' in ('1','2')
d |
----------------------------
{"id": 1, "value": "value1"}|
{"id": 2, "value": "value2"}|
删除
删除刚才添加的 "address_path"
UPDATE
json_test_table
SET
jsonb_data = jsonb_data - 'address_path'
WHERE
id = 2
参考
Postgresql Release 9.2,by postgresql.org
Postgresql Release 9.4,by postgresql.org
Postgresql JSON Functions and Operators,by postgresql.org
PostgreSQL JSON 函数和操作符,by w3cschool.cn
Postgresql——jsonb类型的更多相关文章
- postgresql jsonb类型查询
select * from (select * from ud_order where user_id=10 and status=2unionselect * from ud_order where ...
- PostgreSQL 数组类型使用详解
PostgreSQL 数组类型使用详解 PostgreSQL 数组类型使用详解 可能大家对 PostgreSQL 这个关系型数据库不太熟悉,因为大部分人最熟悉的,公司用的最多的是 MySQL 我们先对 ...
- PostgreSQL 保存json,jsonb类型
PostgresQL 字符串隐式转换JSON脚本: -- 隐式将varchar转换为json CREATE OR REPLACE FUNCTION json_in_varchar(varchar) R ...
- postgresql ltree类型
最近一个月使用Postgresql的时候,经常遇到ltree的数据,感觉有些别扭,可是有绕不过去.今天决心整理一下,以后使用方便一些. 一.简介 ltree是Postgresql的一个扩展类型,由两位 ...
- PostgreSQL 数组类型
PostgreSQL 支持表的字段使用定长或可变长度的一维或多维数组,数组的类型可以是任何数据库内建的类型.用户自定义的类型.枚举类型, 以及组合类型.但目前还不支持 domain 类型. 数组类型的 ...
- PostgreSQL TIMESTAMP类型 时间戳
PostgreSQL 提供两种存储时间戳的数据类型: 不带时区的 TIMESTAMP 和带时区的 TIMESTAMPTZ. TIMESTAMP 数据类型可以同时存储日期和时间,但它不存储时区.这意味着 ...
- postgresql数字类型
postgresql的数据类型很多,也可以使用create type命令创建自定义数据类型,但常用的数据类型是以下三种: l 数字数据类型 l 字符串数据类型 l 日期/时间数据类型 数字数据类 ...
- PostgreSQL数组类型应用
在使用 awk 脚本:数组是一大利器:在很多场景是用数组能处理. 在 python 中,数据类型list:相当于array类型. 在 Oracle 中,对 array 不够友好,感觉像是鸡肋.但是在 ...
- Postgresql Jsonb字段内含数组属性的删除元素操作
1.创建示例表 create temp table settings as select '{"west": [ {}, {} ]}'::jsonb as value; 2.如下保 ...
- PostgreSQL字段类型说明
BIGSERIALSERIAL8 存储自动递增的惟一整数,最多 8 字节. BIT 固定长度的位串. BIT VARYING(n)VARBIT(n) 可变长度的位串,长度为 n 位. BOOLEAN ...
随机推荐
- pandas 缺失值与空值处理
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/lwgkzl/article/detail ...
- 什么是PMP?
PMP(Project Management Professional)中文名称叫项目管理专业人士资格认证.它是由美国项目管理协会(PMI)发起的,严格评估项目管理人员知识技能是否具有高品质的资格认证 ...
- 王道oj/problem9(数组的输入和输出)
网址:http://oj.lgwenda.com/problem/9 思路:第一次读取数组的个数,由于数组不能动态创建,所以先创建最大值a[100] 第二次读取采用循环读取,直接将数组元素读入 最后再 ...
- python教程 入门学习笔记 第3天 编程基础常识 代码注释 变量与常量
编程基础常识 一.注释 1.对代码的说明与解释,它不会被编译执行,也不会显示在编译结果中 2.注释分为:单行注释和多行注释 3.用#号开始,例如:#这是我的第一个python程序 4.注释可以写在单独 ...
- 从 Pulsar Client 的原理到它的监控面板
背景 前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了.生产者消息发送缓慢等各种问题. 虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,比如速率.流量.消 ...
- IDA的使用2
IDA的使用2 string类型的选择 Rename 要注意如果再namelist和public name里面是不能重名 操作数 这个主要和开发结合精密, change sign-改变符号 bitwi ...
- python flask 简单应用开发
转载请注明出处: Flask 是一个基于 Python 的微型 Web 框架,它提供了一组简洁而强大的工具和库,用于构建 Web 应用程序.Flask 的主要作用是帮助开发者快速搭建轻量级的.灵活的 ...
- JOIN 关联表中 ON、WHERE 后面跟条件的区别
SQL中join连接查询时条件放在on后与where后的区别 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和wh ...
- 在 Net7.0环境下通过反射创建泛型实例和调用泛型方法
一.介绍 最近没事干,就用闲暇时间写点东西,也记录一下温习历程.老人说的好,好记性,不如烂笔头.时间一长,当时记忆的再清楚,都会变得模糊,索性就写博客记录下来,如果下次需要,直接打开博客就找到了,不用 ...
- 2023年Vue开发中的8个最佳工具
前言 Vue.js,一款当今非常流行的基于JavaScript的开源框架,旨在构建动态的可交互应用. Vue.js以其直观的语法和灵活的架构而广受全球开发者的欢迎和赞誉.随着时间的推移,Vue不断进化 ...