使用 JSONpath 重新创建具有原始键子集的现有对象
Use JSONpath to re-create existing objects with a subset of the original keys
假设我有这样一个对象:
{
"foo": "bar",
"baz": "quux",
"erase": "me",
"superfluous": true
}
是否可以构造一个 JSON 路径查询,returns 一个只有原始键的子集的新对象,例如,
{
"foo": "bar",
"baz": "quux",
}
这种“过滤”的原因是我有一个 json
属性作为 PostgreSQL 中实体的一部分,该实体通常包含一个复杂的 JSON 对象列表。检索所有数据给我大约 5MB 的属性(每个结果行),而对于那个特定的查询,我只需要 JSON 对象的两个属性。
单独使用 json_path_query()
是否可行,还是我需要不同的方法?
没有内置函数,但是很容易写一个:
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']);
Returns: {"baz": "quux", "foo": "bar"}
假设我有这样一个对象:
{
"foo": "bar",
"baz": "quux",
"erase": "me",
"superfluous": true
}
是否可以构造一个 JSON 路径查询,returns 一个只有原始键的子集的新对象,例如,
{
"foo": "bar",
"baz": "quux",
}
这种“过滤”的原因是我有一个 json
属性作为 PostgreSQL 中实体的一部分,该实体通常包含一个复杂的 JSON 对象列表。检索所有数据给我大约 5MB 的属性(每个结果行),而对于那个特定的查询,我只需要 JSON 对象的两个属性。
单独使用 json_path_query()
是否可行,还是我需要不同的方法?
没有内置函数,但是很容易写一个:
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']);
Returns: {"baz": "quux", "foo": "bar"}