原文地址:http://blog.2ndquadrant.com/jsonb-and-postgresql-9-5-with-even-more-powerful-tools/
介绍
在Postgresql9.5中引入了新的JSONB功能,极大的增强了PG的NOsql能力,本篇文章通过一些例子演示了如何使用这些强大的功能。
JSON特性从9.2版本开始引入,并在以后的新版本中不断的增强这些功能,
如果您能json的操作还不太了解,建议您看看以前的文章。
NoSQL with PostgreSQL 9.4 and JSONB
JSONB type performance in PostgreSQL 9.4
PostgreSQL anti-patterns: Unnecessary json/hstore dynamic columns
连接两个jsonb对象
在9.5中引入的新的JSONB操作符号
# select '{"a":3}'::jsonb || '{"b":4}'::jsonb; ?column? ------------------ {"a": 3,"b": 4} (1 row) # select '{"a":3}'::jsonb || '{"b":"a6"}'::jsonb; ?column? --------------------- {"a": 3,"b": "a6"} (1 row)@H_404_36@这个功能,相当于insert和update的功能的合并,如果在原来的对象中不存在新增加的jsonb子对象,则增加,否则,则更新为新的对象.并且,不区分新的对象的类型,
使用减号-删除对象
使用减号-删除已经存在的键值对中的一个对象
select '{"a":3}'::jsonb - 'a'; ?column? \---------- {} (1 row) select '{"a":3,"b":"AAA"}'::jsonb - 'a'; ?column? \----------- {"b": "AAA"} (1 row)@H_404_36@如果jsonb对象量个数组,则你可以用 减数字 的形式用索引来删除数组元素,数组以0开头
select '["AAA","BBB","CCC"]'::jsonb -1; ?column? ---------------- ["AAA","CCC"] (1 row)@H_404_36@删除嵌套数组
select '{"person":{"name":"张三","sex":"female","birthday":"1977-01-01"}}'::jsonb \#- '{person,birthday}'; ?column? ----------------------------------------------- {"person": {"sex": "female","name": "张三"}} (1 row)@H_404_36@或者
select '{"person":{"name":"张三","birthday":"1977-01-01"}}'::jsonb \#- '{person,birthday}'::text[]; ?column? ----------------------------------------------- {"person": {"sex": "female","name": "张三"}} (1 row)@H_404_36@新函数jsonb_set
select jsonb_set('{"person":{"name":"张三"}}'::jsonb,'{person,name}','"李四"'::jsonb,false); jsonb_set ------------------------------ {"person": {"name": "李四"}} (1 row) select jsonb_set('{"person":{"name":"张三"}}'::jsonb,sex}','"female"'::jsonb,true); jsonb_set ----------------------------------------------- {"person": {"sex": "female","name": "张三"}}@H_404_36@注意
1. 第三个参数必须是一个合法的jsonb类型,也就是说字符串类型必须先用双引号引起来,再用单引号引起来。
2.第四个的布尔参数,是如果不存在这个值,是否新增,如果为true,则当不存在这个键名和值时,会增加到对象中。美化json
下面的例子不用多说,让显示的json更直观一些。
select jsonb_pretty(jsonb_set('{"person":{"name":"张三"}}'::jsonb,true)); jsonb_pretty -------------------------- { + "person": { + "sex": "female",+ "name": "张三" + } + } (1 row)@H_404_36@总结
通过以上的例子,我们可以看到,postgresql也是一个NOsql数据库,因此,如果我们能熟悉Postgresql,那么,我们就可以在一种数据库上同时使用NOsql和sql技术,以避免使用不同的产品及技术造成的产品复杂性的增加和后续维护的难度。
Use Postgresql,Use Everywhere.