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

标签 postgresql jsonpath postgresql-12

我在 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]}), {}))

关于postgresql 12 jsonb_path_query 如何从一个大的 jsonb 对象中选择一些键来构造一个小对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66809761/

相关文章:

postgresql - 您可以逻辑地复制物理 Postgres 副本吗?

java - 搜索类型 JSONPath

sql - 转储到 CSV/Postgres 内存

django - Django项目中全文搜索的搜索引擎

postgresql - pg_ctl promote not suspending replication 快速

json - artillery.io JSON 值捕获不起作用

json - 使用 JSON 路径跳过双引号

sql - 如何在Postgres中的分区表中进行搜索?

postgresql - 如何在 PostgreSQL 的更新语句中分配局部变量

ruby-on-rails - 仅在生产中发生错误时如何调试 Rails 应用程序?