- jsonb 存储数组类型
存储时元素需转化为字符串
ids :jsonb [“1”, “2”,“3”]
where ids ?| ARRAY ['1']
- jsonb 存储对象类型内包含数组类型
存储的数组内的元素需要转化成字符串
ids :jsonb {“userIds”:[“1”,“2”,“3”] }
# 查询是要将元素取出转化为jsonb数组类型进行查询
where (ids->> 'userIds')::jsonb ?| ARRAY ['1']
- jsonb 存储复杂类型(数组与对象嵌套)
想要查询jsonb内 包含"h": "66666666666"数据
存储格式:
字段名:items :: jsonb
{
"a": [{
"b": "ccccc",
"d": [{
"e": "eeeee",
"f": {
"g": "ggggggggggg",
"h": "HHHHHHHHHHHHHH"
}
}, {
"e": "fffffffff",
"f": {
"g": "rrrrrrrrrr",
"h": "66666666666" # 想要查询到的字段
}
}]
}, {
"b": "ccccc",
"d": [{
"e": "eeeee",
"f": {
"g": "TTTTTTTTT",
"h": "UUUUUUU"
}
}, {
"e": "QQQQQQQQ",
"f": {
"g": "WWWWWWWWW",
"h": "4444444444"
}
}]
}]
}
-
获取items 中的 a 数组对象:
items ->> 'a'
得到结果为一行的jsonb 的数组格式
-
jsonb 数组格式需要使用函数json_array_elements()处理为单独的jsonb 对象,使用时需要将jsonb 数组格式转化为jsonb
jsonb_array_elements((items ->> 'a')::jsonb)
得到结果为两行的a数组中对象
-
获取a数组对象中的d数组对象:
jsonb_array_elements((items ->> 'a')::jsonb)->>"d"
得到结果为d的jsonb的数组格式,由于第二步中a中的数组分为两行
所以会有两行的d的jsonb的数组格式
-
第三步中的结果为数组格式,则如同第二步操作一样,转换为jsonb 格式后拆分数组转化为多行对象
jsonb_array_elements(jsonb_array_elements((items ->> 'a')::jsonb)->>"d"::jsonb)
得到的结果为四行的d中的对象
-
获取d对象中的f对象
jsonb_array_elements(jsonb_array_elements((items ->> 'a')::jsonb)->>"d"::jsonb)->>"f"
得到的结果为四行的f对象
-
在获取了单层的对象后就可以结合jsonb的查询操作进行对数据的筛选
想要查询items中包含"h": "66666666666"数据
先通过子查询 将 items字段转化为多行的f对象
然后就可以直接查询f中包含"h": "66666666666"数据即可
where f::jsonb @> '{\"h\":\"66666666666\"}' :: jsonb