【问题标题】:Use JSONpath to re-create existing objects with a subset of the original keys使用 JSONpath 使用原始键的子集重新创建现有对象
【发布时间】:2022-01-24 01:27:37
【问题描述】:

假设我有一个这样的对象:

{
   "foo": "bar",
   "baz": "quux",
   "erase": "me",
   "superfluous": true
}

是否可以构造一个 JSONpath 查询来返回一个新对象,该对象只包含原始键的一个子集,例如,

{
   "foo": "bar",
   "baz": "quux",
}

这种“过滤”的原因是我有一个 json 属性作为 PostgreSQL 中实体的一部分,该实体通常包含复杂 JSON 对象的列表。检索所有数据后,仅属性(每个结果行)就有大约 5MB 的空间,而对于该特定查询,我只需要 JSON 对象的两个属性。

单独使用json_path_query() 是否可行,还是我需要不同的方法?

【问题讨论】:

    标签: json postgresql jsonpath


    【解决方案1】:

    没有内置函数,但写一个很容易:

    create function keep_keys(p_input jsonb, p_to_keep text[])
      returns jsonb
    as
    $$
      select jsonb_object_agg(key, value
      from jsonb_each(p_input) as t(key, value)
      where t.key = any (p_to_keep);
    $$
    language sql;
    

    这个:

    select keep_keys('{"foo": "bar",
                       "baz": "quux",
                       "erase": "me",
                       "superfluous": true}', 
                     array['foo', 'baz']);
    

    返回:{"baz": "quux", "foo": "bar"}

    【讨论】:

    • 这非常通用,谢谢 — 我也可以将它用于对象数组!
    猜你喜欢
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    相关资源
    最近更新 更多