本文介绍: 存储:json是文本,jsonb是二进制代码。jsonb占用空间小,查询效率更高。查询:json需要deserialize,jsonb支持索引直接查询内部字段。将JSON数据二进制化存储,整个字段作为一个值进行更新。更新:json支持部分更新,jsonb只能整体更改。jsonb适用于查询较多,内部字段需要索引的场景。使用文本存储JSON数据,可以进行有选择的更新。支持索引,可以直接对内部字段建立索引快速查询。不支持索引,不能直接对内部字段进行查询。索引:只有jsonb支持索引内部字段。
一、jsonb
# 新增
add_column :shi_tis, :setting, :jsonb, default: {}
# string转jsonb
def change
change_column :users, :setting, :jsonb, using: 'setting::jsonb', default: {}
end
# 加索引
add_index :users, :setting, using: :gin # 这样就为setting jsonb字段创建了一个索引。
# 后续就可以利用这个索引来快速查询内部字段值:
User.where("setting->>'name' = ?", 'LiLei')
# 如果字段较大,也可以只为某个内部路径添加索引:
add_index :users, ("setting->'name'"), using: :gin
jsonb查询
#<User:0x000000010b37ebd0> {
:id => 2,
:mobile => nil,
:setting => {
"name" => "LiLei",
"age" => 2,
"wechat" => { "nickname" => "sky", "openid" => 'x23212x' }
}
}
User.where("setting @> ?", { name: 'LiLei' }.to_json)
User.where("setting ->> 'name' = ?", 'LiLei')
User.where("setting -> 'wechat' = ?", { nickname: 'sky' }.to_json)
User.where("setting -> 'wechat' ->> 'nickname' = ?", 'sky')
json和jsonb字段在Postgres数据库层面有以下区别:
-
json
使用文本存储JSON数据,可以进行有选择的更新。
查询需要先解析JSON字符串再进行操作,效率较低。
不支持索引,不能直接对内部字段进行查询。 -
jsonb
将JSON数据二进制化存储,整个字段作为一个值进行更新。
内部使用类似于哈希的结构存储,所以查询效率很高。
支持索引,可以直接对内部字段建立索引快速查询。 -
具体差异:
存储:json是文本,jsonb是二进制代码。jsonb占用空间小,查询效率更高。
更新:json支持部分更新,jsonb只能整体更改。
查询:json需要deserialize,jsonb支持索引直接查询内部字段。
索引:只有jsonb支持索引内部字段。
二、Array
create_table :books do |t|
t.string 'title'
t.string 'tags', array: true
t.integer 'ratings', array: true
end
add_index :books, :tags, using: 'gin'
add_index :books, :ratings, using: 'gin'
Book.create title: "Brave New World",
tags: ["fantasy", "fiction"],
ratings: [4, 5]
# 包含fantasy的tags
Book.where("'fantasy' = ANY (tags)")
# 包含["fantasy", "fiction"]2个
Book.where("tags @> ARRAY[?]::varchar[]", ["fantasy", "fiction"])
# 匹配["fantasy", "fiction"]中任意一个
Book.where("tags && ARRAY[?]::varchar[]", ["fantasy", "fiction"])
## Books with 3 or more ratings
Book.where("array_length(ratings, 1) >= 3")
原文地址:https://blog.csdn.net/qq_41037744/article/details/134634893
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_35626.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。