如何查询 JSONB 列
How to query a JSONB column
我正在构建一个 Rails 5.2 应用程序。我正在使用 Postgres。
在这个应用程序中,我有一个用户对象,在这个对象中,我有一个 JSONB 列。
我需要能够查询 JSONB 对象中的特定属性。
我在用户模型中是这样定义的:
serialize :preferences
store_accessor :preferences, PREFERENCES
这是对象的内容:
{"digest_is_active"=>true, "digest_frequency"=>"modal", "digest_time"=>"10:00"}
我试过这个:
scope :digest_active, -> { where("preferences @> ?", { "digest_is_active": true }.to_json) }
User.where("preferences->>'digest_time' = ?", "10:00")
查询似乎运行没有错误,但找不到用户对象。
SELECT "users".* FROM "users" WHERE (preferences @> '{"digest_is_active":true}') LIMIT [["LIMIT", 11]]
不要这样做:
serialize :preferences
这会将您的 Ruby 哈希编码为一团 YAML 文本,然后该字符串将进入您的 jsonb
列。一个字符串是有效的 JSON 所以数据库可以接受这个但它不会理解内部结构所以数据库的 JSON 运算符不会有多大用处。
从您的模型中删除 serialize
,修复任何现有数据,您的查询应该会更顺利。
我正在构建一个 Rails 5.2 应用程序。我正在使用 Postgres。 在这个应用程序中,我有一个用户对象,在这个对象中,我有一个 JSONB 列。
我需要能够查询 JSONB 对象中的特定属性。
我在用户模型中是这样定义的:
serialize :preferences
store_accessor :preferences, PREFERENCES
这是对象的内容:
{"digest_is_active"=>true, "digest_frequency"=>"modal", "digest_time"=>"10:00"}
我试过这个:
scope :digest_active, -> { where("preferences @> ?", { "digest_is_active": true }.to_json) }
User.where("preferences->>'digest_time' = ?", "10:00")
查询似乎运行没有错误,但找不到用户对象。
SELECT "users".* FROM "users" WHERE (preferences @> '{"digest_is_active":true}') LIMIT [["LIMIT", 11]]
不要这样做:
serialize :preferences
这会将您的 Ruby 哈希编码为一团 YAML 文本,然后该字符串将进入您的 jsonb
列。一个字符串是有效的 JSON 所以数据库可以接受这个但它不会理解内部结构所以数据库的 JSON 运算符不会有多大用处。
从您的模型中删除 serialize
,修复任何现有数据,您的查询应该会更顺利。