gpt4 book ai didi

json - Postgres JSON 数据类型 Rails 查询

转载 作者:IT老高 更新时间:2023-10-28 12:45:40 24 4
gpt4 key购买 nike

我正在使用 Postgres 的 json 数据类型,但想对嵌套在 json 中的数据进行查询/排序。

我想在 json 数据类型上使用 .where 进行排序或查询。例如,我想查询关注者数量 > 500 的用户,或者我想按关注者或关注者数量订购。

谢谢!

例子:

model User

data: {
"photos"=>[
{"type"=>"facebook", "type_id"=>"facebook", "type_name"=>"Facebook", "url"=>"facebook.com"}
],
"social_profiles"=>[
{"type"=>"vimeo", "type_id"=>"vimeo", "type_name"=>"Vimeo", "url"=>"http://vimeo.com/", "username"=>"v", "id"=>"1"},
{"bio"=>"I am not a person, but a series of plants", "followers"=>1500, "following"=>240, "type"=>"twitter", "type_id"=>"twitter", "type_name"=>"Twitter", "url"=>"http://www.twitter.com/", "username"=>"123", "id"=>"123"}
]
}

最佳答案

对于任何偶然发现这一点的人。我提出了一个使用 ActiveRecord 和 Postgres 的 JSON 数据类型的查询列表。随意编辑它以使其更清晰。

以下使用的 JSON 运算符的文档:https://www.postgresql.org/docs/current/functions-json.html .

# Sort based on the Hstore data:
Post.order("data->'hello' DESC")
=> #<ActiveRecord::Relation [
#<Post id: 4, data: {"hi"=>"23", "hello"=>"22"}>,
#<Post id: 3, data: {"hi"=>"13", "hello"=>"21"}>,
#<Post id: 2, data: {"hi"=>"3", "hello"=>"2"}>,
#<Post id: 1, data: {"hi"=>"2", "hello"=>"1"}>]>

# Where inside a JSON object:
Record.where("data ->> 'likelihood' = '0.89'")

# Example json object:
r.column_data
=> {"data1"=>[1, 2, 3],
"data2"=>"data2-3",
"array"=>[{"hello"=>1}, {"hi"=>2}],
"nest"=>{"nest1"=>"yes"}}

# Nested search:
Record.where("column_data -> 'nest' ->> 'nest1' = 'yes' ")

# Search within array:
Record.where("column_data #>> '{data1,1}' = '2' ")

# Search within a value that's an array:
Record.where("column_data #> '{array,0}' ->> 'hello' = '1' ")
# this only find for one element of the array.

# All elements:
Record.where("column_data ->> 'array' LIKE '%hello%' ") # bad
Record.where("column_data ->> 'array' LIKE ?", "%hello%") # good

关于json - Postgres JSON 数据类型 Rails 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22667401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com