PostgreSQL 12 jsonb_path_query如何选择一些键来从大 jsonb 对象构造一个小对象?



我在 Postgres 12 中有一个data JSONB列,它保存了一个带有.interactions字段的大对象,该字段是大对象的数组,每个对象都非常大,应用程序层不需要的字段太多,想知道有没有办法只查询出感兴趣的字段?

{
"interactions": [
{ "k1": ..., "k2": ..., "k3": ..., "k4": ... },
{ "k1": ..., "k2": ..., "k3": ..., "k4": ... },
{ "k1": ..., "k2": ..., "k3": ..., "k4": ... },
]
// many other key-value pairs
}

想要这样的东西:假设如果唯一感兴趣的字段是 k1、k3、...

SELECT jsonb_path_query_array(data, '$.interactions[*].{k1,k3}')

要获得纤细结果对象,例如:

[ { "k1", ..., "k3": ... }, { "k1", ..., "k3": ... } ]

在命令行上,jq就像{ k1,k3 }一样简单:

➸  echo '{"k1":3,"k2":4,"k3":5,"k4":"ok"}
{"k1":-1,"k2":2,"k3":6}' | jq -c '{ k1, k3 }'
{"k1":3,"k3":5}
{"k1":-1,"k3":6}

还有一个问题:像k1,k3这样的感兴趣的字段名称是否可以不是硬编码的,而是由不同的应用程序逻辑提供的参数?

到目前为止,我只知道如何构建单个对象,从大对象到只有感兴趣字段的纤薄对象,

SELECT jsonb_build_object(
'k1', data->'k1',
'k3', data->'k3',
// ...
) FROM ...

但不确定如何申请数组中的每个对象? JavaScript 中类似这样的东西:

dataArray.map(obj =>
['f1', 'f3'].reduce((acc, k) => Object.assign(acc, {[k]: obj[k]}), {}))

最新更新