tipo recorrer json_populate_recordset guardar example ejemplo dato json postgresql ruby-on-rails-4 rails-postgresql psql

recorrer - Consulta de carriles tipo de datos Postgres JSON



recorrer json postgresql (3)

De acuerdo con este http://edgeguides.rubyonrails.org/active_record_postgresql.html#json hay una diferencia en el uso de -> y ->> :

# db/migrate/20131220144913_create_events.rb create_table :events do |t| t.json ''payload'' end # app/models/event.rb class Event < ActiveRecord::Base end # Usage Event.create(payload: { kind: "user_renamed", change: ["jack", "john"]}) event = Event.first event.payload # => {"kind"=>"user_renamed", "change"=>["jack", "john"]} ## Query based on JSON document # The -> operator returns the original JSON type (which might be an object), whereas ->> returns text Event.where("payload->>''kind'' = ?", "user_renamed")

Entonces debería probar Record.where("data ->> ''status'' = 200 ") o el operador que se adapte a su consulta ( http://www.postgresql.org/docs/current/static/functions-json.html ) .

Estoy usando el tipo de datos json de Postgres, pero quiero hacer una consulta / ordenamiento con datos que están anidados dentro del json.

Quiero pedir o consultar con .where en el tipo de datos json. Por ejemplo, quiero hacer una consulta para los usuarios que tienen un conteo de seguidores> 500 o quiero ordenar por seguidor o recuento siguiente.

¡Gracias!

Ejemplo:

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"} ] }


Para cualquiera que tropiece con esto. He creado una lista de consultas usando ActiveRecord y el tipo de datos JSON de Postgres. Siéntase libre de editar esto para hacerlo más claro.

Comandos de rieles importantes de Postgres:

# Sort based on the Hstore data: 2.1.1 :022 > Post.order("data->''hello'' DESC") => #<ActiveRecord::Relation [#<Post id: 4, created_at: "2014-04-16 01:05:49", updated_at: "2014-04-16 01:05:49", data: {"hi"=>"23", "hello"=>"22"}>, #<Post id: 3, created_at: "2014-04-16 01:05:37", updated_at: "2014-04-16 01:05:37", data: {"hi"=>"13", "hello"=>"21"}>, #<Post id: 2, created_at: "2014-04-16 01:05:28", updated_at: "2014-04-16 01:05:28", data: {"hi"=>"3", "hello"=>"2"}>, #<Post id: 1, created_at: "2014-04-16 01:05:05", updated_at: "2014-04-16 01:05:05", data: {"hi"=>"2", "hello"=>"1"}>]> # Where inside a JSON object: Record.where("data ->> ''likelihood'' = ''0.89''") # Searching nested json object: 2.1.1 :130 > r.column_data => {"data1"=>[1, 2, 3], "data2"=>"data2-3", "array"=>[{"hello"=>1}, {"hi"=>2}], "nest"=>{"nest1"=>"yes"}} 2.1.1 :130 > Record.where("column_data -> ''nest'' ->> ''nest1'' = ''yes'' ") # Searching within array: Record.where("column_data #>> ''{data1,1}'' = ''2'' ") # Searching 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%'' ") # This is advised against in rails, use below: Record.where("column_data ->> ''array'' LIKE ?", "%hello%")

Actualizar Voy a escribir una publicación de blog sobre esto muy pronto y pondré el enlace aquí.


Su pregunta no parece corresponderse con los datos que ha mostrado, pero si su tabla se llama users y los data son un campo en esa tabla con JSON como {count:123} , entonces la consulta

SELECT * WHERE data->''count'' > 500 FROM users

trabajará. Eche un vistazo al esquema de su base de datos para asegurarse de que comprende el diseño y verifica que la consulta funcione antes de complicarla con las convenciones de Rails.