Postgres JSONB - 查询所有根键

Postgres JSONB - query all root keys

PostgreSQL (13.2)

我有一个包含 2 列的 table - timestamp 和 snapshot。 Snapshot 包含一个 JSONB - 代表仓库状况的字典。 数据结构是这样的

{
    "key1": {...},
    "key2": {...},
    "key3": {...},
    "key4": {...},
    "key5": {...}
}

所以我需要在 json 中获取包含我要查找的数据的特定键。我还需要获取包含 snapshot 的行时间戳。 我该如何查询?

ps。 在 python 中,我可以使用像 dict.keys 这样的 smth,然后开始遍历所有键,我在这里需要类似的东西来搜索数据。

pps。 也知道如何用 SQLAlchemy

实现它会很有趣

[数据库查看器的屏幕截图]

(jsonb_each()).* 从 jsonb 字段中选择所有键和值:

SELECT (JSONB_EACH(blocks)).*
FROM snapshots

然后我们需要通过嵌套键获取值:

SELECT key AS rack_num
     , value ->> 'client_id' AS client_id
     , value ->> 'timestamp' AS _TIMESTAMP
FROM (
      SELECT (JSONB_EACH(blocks)).*
      FROM snapshots
     ) AS t

最后,汇总结果:

SELECT rack_num
       , MIN(_TIMESTAMP) AS appearance_time
FROM (
      SELECT KEY                   AS rack_num
           , VALUE ->> 'client_id' AS client_id
           , VALUE ->> 'timestamp' AS _TIMESTAMP
      FROM (
            SELECT (JSONB_EACH(blocks)).*
            FROM snapshots
           ) AS t
      ) AS racks
WHERE client_id = :client_id
GROUP BY rack_num, client_id
ORDER BY MIN(_TIMESTAMP) DESC;