我正在寻找与postgres json处理函数中的mongodb相当的'$ project'
我有一个大的json对象,我想从中选择一些字段。 特定的字段名称是动态的,所以我正在寻找一个不包括硬编码的解决方案
例如,给定对象如:
{
'a':...
'b':...
'c':...
'd':...
}
像
这样的陈述select json_project(data, ['a','b'])
from table
应该返回
{
'a':...
'b':...
}
其中字段列表应为参数
答案 0 :(得分:1)
这应该做(未经测试):
CREATE FUNCTION json_project(doc json, keys json) RETURN json AS $$
SELECT json_agg(json_build_object(d.key, d.value))
FROM json_each(doc) d
JOIN json_array_elements(keys) k ON k.value = d.key;
$$ LANGUAGE SQL;
诀窍是将json
doc分解为其键(文本)和值(标量或更复杂的json文档),然后将JOIN
分解为爆炸参数数组中包含的键,最后将匹配聚合成一个新的json
文档。
请注意,如果您使用jsonb
类型,则应使用jsonb_*
变体调用所有函数。
答案 1 :(得分:0)
这是我的尝试:
let dp = UIBezierPath.init(rect: myRect)
dp.stroke()
如果你将它作为:
运行CREATE or replace FUNCTION json_project(jsondata jsonb, jsonfields varchar) RETURNS json
AS $$
declare
newJson varchar;
cs record;
BEGIN
newJson := '{';
for cs in (select key, value
from json_each(jsondata::json)
where key in (select * from unnest(string_to_array(jsonfields,','))) ) loop
if newJson != '{' then
newJson := newJson || ',';
end if;
newJson := newJson || '"'||cs.key||'"'||':'||cs.value;
end loop;
newJson := newJson || '}';
RETURN newJson::jsonb;
END;
$$ LANGUAGE plpgsql;
你会得到
select json_project( '{"a":"someAvalue", "b":"someBvalue", "c":1, "d":"someDvalue" }',
'a,c' );