如何查询 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,修复任何现有数据,您的查询应该会更顺利。