加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

PostgreSQL何以支持丰富的NoSQL特性?

发布时间:2018-11-08 07:44:24 所属栏目:MySql教程 来源:DBAplus社群
导读:副标题#e# 【新品产上线啦】51CTO播客,随时随地,碎片化学习 作者介绍 谭峰,网名francs,中国开源软件推进联盟PostgreSQL分会特聘专家,《PostgreSQL实战》作者之一,《PostgreSQL 9 Administration Cookbook》译者之一。现就职于浙江移动负责应用上云架

jsonb键/值追加可通过||操作符,如下增加sex键/值:

  1. mydb=> SELECT '{"name":"francs","age":"31"}'::jsonb ||  
  2. '{"sex":"male"}'::jsonb;  
  3. ?column?  
  4. ------------------------------------------------  
  5. {"age": "31", "sex": "male", "name": "francs"}  
  6. (1 row) 

jsonb键/值的删除有两种方法,一种是通过操作符号-删除,另一种通过操作符#-删除指定键/值。

通过操作符号-删除键/值如下:

  1. mydb=> SELECT '{"name": "James", "email": "james@localhost"}'::jsonb  
  2. - 'email';  
  3. ?column?  
  4. -------------------  
  5. {"name": "James"}  
  6. (1 row)  
  7. mydb=> SELECT '["red","green","blue"]'::jsonb - 0;  
  8. ["green", "blue"] 

第二种方法是通过操作符#-删除指定键/值,通常用于有嵌套json数据删除的场景,如下删除嵌套contact中的fax键/值:

  1. mydb=> SELECT '{"name": "James", "contact": {"phone": "01234 567890", "fax": "01987 543210"}}'::jsonb #- '{contact,fax}'::text;  
  2. ?column?  
  3. ---------------------------------------------------------  
  4. {"name": "James", "contact": {"phone": "01234 567890"}}  
  5. (1 row) 

删除嵌套aliases中的位置为1的键/值,如下所示:

  1. mydb=> SELECT '{"name": "James", "aliases": ["Jamie","The Jamester","J Man"]}'::jsonb #- '{aliases,1}'::text;  
  2. {"name": "James", "aliases": ["Jamie", "J Man"]}  
  3. (1 row) 

键/值的更新也有两种方式,第一种方式为||操作符,||操作符可以连接json键,也可覆盖重复的键值,如下修改age键的值:

  1. mydb=> SELECT '{"name":"francs","age":"31"}'::jsonb ||  
  2. '{"age":"32"}'::jsonb;  
  3. ?column?  
  4. ---------------------------------  
  5. {"age": "32", "name": "francs"}  
  6. (1 row) 

第二种方式是通过jsonb_set函数,语法如下:

  1. jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean]) 

target指源jsonb数据,path指路径,new_value指更新后的键值,create_missing 值为 true表示如果键不存在则添加,create_missing 值为 false表示如果键不存在则不添加,示例如下:

  1. mydb=> SELECT jsonb_set('{"name":"francs","age":"31"}'::jsonb,'{age}','"32"'::jsonb,false);  
  2. jsonb_set  
  3. mydb=> SELECT jsonb_set('{"name":"francs","age":"31"}'::jsonb,'{sex}','"male"'::jsonb,true); 

7、给JSONB类型创建索引

这一小节介绍给jsonb数据类型创建索引,jsonb数据类型支持GIN索引,为了便于说明,假如一个json字段内容如下,并且以jsonb格式存储。

  1. {  
  2. "id": 1,  
  3. "user_id": 1440933,  
  4. "user_name": "1_francs",  
  5. "create_time": "2017-08-03 16:22:05.528432+08"  

假如存储以上jsonb数据的字段名为user_info,表名为tbl_user_jsonb,在user_info字段上创建GIN索引语法如下:

CREATE INDEX idx_gin ON tbl_user_jsonb USING gin(user_info);

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读