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;
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;