1. 建表

create table demo(
id serial NOT NULL PRIMARY KEY,
name VARCHAR(20),
info JSONB
);

2.存储对象操作

2.1添加

insert into demo (name, info)values ('张三1', '{"age":12, "class":"二年级"}');
insert into demo (name, info)values ('张三', '{"age":16, "class":"五年级"}');
insert into demo (name, info)values ('张三3', '{"age":20, "class":"初一"}');

2.2. 查询

2.2.1 查询年龄12岁的信息

这里好像是对象中的字符串匹配,如果把数字12变成"12"就会匹配不到

select * from demo where info @> '{"age":12}'::jsonb
2.2.2 查询年龄大于16岁的信息

这里将jsonb中的属性转化为了int

select * from demo where (info->>'age')::int4 > 16

2.3 修改

jsonb中的属性修改,某一键值对修改,使用jsonb_set函数

update demo as d set
info = jsonb_set
(
(select info from demo where id = d.id)::jsonb,-- target 这是目的json数据,这里使用内部关联将对应的json查询出来
'{class}', -- path 要修改的jsonb中对应的key
'"语文"'::jsonb, -- new_value 替换的value
false -- create_missing:: true:- 如果不存在对应的key值,则新增,反之,false - 不做其他操作,这里可有可无
) where id = 1;

3.存储对象数组

3.1添加

insert into demo (name, info)values ('李四', '[{"age":8, "class":"一年级"},{"age": 10, "class": "三年级"}]');
insert into demo (name, info)values ('李四2', '[{"age":12, "class":"五年级"},{"age":16, "class":"初三"}]');
insert into demo (name, info)values ('李四3', '[{"age":19, "class":"高一"},{"age":8, "class":"一年级"}, {"age":10, "class":"三年级"}]');

3.2 修改

3.2.1 追加对象数组
update demo set info = info || '[{"age":9,"class":"二年级"}]'::jsonb where id = 1;
3.2.2 修改数组中某一对象属性
update demo d set info = jsonb_set(
info,
array[
(select ORDINALITY::INT - 1 FROM demo d2,
jsonb_array_elements(info) WITH ORDINALITY WHERE d.id = d2.id AND value->>'class' = '三年级')::text, -- 确定到准确的对象中
'class' -- 需要修改的key
],
'"四年级"' -- 替换的value
)where id = 1;

3.3 查找

select * from demo where info @> '[{"class": "三年级"}]'; 

3.4 遍历

用到了jsonb_to_recordset函数

SELECT t.* FROM demo, jsonb_to_recordset(info) AS t(age int, class text) WHERE demo.id=7;
 
 

psql的jsonb操作--存储对象/对象数组的更多相关文章

  1. Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)

    Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式) 原文地址:http://alanland.iteye.com/admin/blogs/1600685(欢迎转载 ...

  2. JS对象和数组在谷歌浏览器中引用存储的表现

    大家都知道JS的数据分为基本类型和引用类型.具体什么不说了,今天主要说说对象和数组作为引用类型在谷歌浏览器中的表现. 首先,问题是这么发现的.我在控制台使用console打印了一个数组,然后对数组进行 ...

  3. 简述JavaScript对象、数组对象与类数组对象

    问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...

  4. NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象

    摘要: NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的 ...

  5. NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象 - lady-奕奕的个人空间 - 开源中国社区

    一.了解NSUserDefaults以及它可以直接存储的类型 NSUserDefaults是一个,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前 ...

  6. LocalStorage存储JSON对象的问题

    LocalStorage存储JSON对象的问题   localStorage - 没有时间限制的数据存储 1 var arr=[1,2,3]; 2 localStorage.setItem(" ...

  7. js操作文档对象的节点

    好吧,为了能让大家不至于睡着,我们先回顾先前面的东东吧~ 1.首先我们写了javaScriput的是一门弱类型的解释性的脚本语言:弱类型:我们的变量不用申明其具体的数据类型,在使用的时候浏览器根据其存 ...

  8. 转-NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象

    转自:http://my.oschina.net/u/1245365/blog/294449 摘要 NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密 ...

  9. 深夜重温JavaScript中的对象和数组

    这一块实际上已经学过了,因为没有学好,在工作过程中遇到一些对象或者数组的操作,会去百度查找,浪费了许多宝贵的时间,所以特地再拐过头来重新学习. 对象 基本概念: 对象这种基本的数据结构还有其他很多种叫 ...

随机推荐

  1. 邪恶的csrf

    关于csrf是啥我就不多说了 进入正文 场景模拟 场景一 在一个bbs社区里,用户在发言的时候会发出一个这样的GET请求: #!html GET /talk.php?msg=hello HTTP/1. ...

  2. spring boot web 开发及数据库操作

    推荐网站http://springboot.fun/ 1.json 接口开发 2.自定义 filter 3.自定义 property 4.log 配置 5.数据库操作 6.测试

  3. LootCode-链表排序-Java

    链表排序 0.来源 来源:力扣(LeetCode) 题目链接:https://leetcode-cn.com/problems/sort-list 1.题目描述 在 O(n log n) 时间复杂度和 ...

  4. [LC] 505. The Maze II

    There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...

  5. [LC] 318. Maximum Product of Word Lengths

    Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...

  6. nodejs express 框架 上传文件

    web 项目应用express4.0框架 html 表单post 文件上传失败,后端无法获取提交文件 express不支持文件上传. 方式一 若是图片,可以将图片转码为BASE64上传 前端框架ang ...

  7. 探索真实事物的虚拟再现——微软亚洲研究院SIGGRAPH Asia 2014精彩入选论文赏析

    Asia 2014精彩入选论文赏析" title="探索真实事物的虚拟再现--微软亚洲研究院SIGGRAPH Asia 2014精彩入选论文赏析"> SIGGRAP ...

  8. 关于unicode汉字范围正则表达式的写法

    \u2E80-\u2EFF:CJK部首补充: \u2F00-\u2FDF:康熙部首: \u3000-\u303F:CJK标点符号: \u31C0-\u31EF:CJK笔划: \u3200-\u32FF ...

  9. pycharm中无法导入pip安装的包

    https://blog.csdn.net/mdxiaohu/article/details/82430060 2020.1.20 练习通过python操作数据库的时候需要导入一个包,因为看代码写的是 ...

  10. 将js进行到底:node学习7

    Node.js之Websocket技术 我第一次听说websocket之时,HTML5标准尚未公布,当时只有少数前瞻性浏览器携带了这个API. 我对websocket最大的印象是,他可以解决我对&qu ...