2016-02-28 33 views
0

我正在尋找相當於'$ project'從MongoDB中postgres json處理函數是否可以從postrgesql中的jsonb對象「投射」特定字段?

我有一個很大的json對象,我想從中選擇一些字段。 特定的字段名稱是動態的,所以我正在尋找,這將不包括硬編碼他們

例如一個解決方案,給定對象,如:

{ 
'a':... 
'b':... 
'c':... 
'd':... 
} 

如下語句

select json_project(data, ['a','b']) 
from table 

應該返回

{ 
'a':... 
'b':... 
} 

這裏的域名列表LD是參數

+0

的結果應該是像或者只是行的JSON? –

+0

最好是json。 與不同列的行也很好。 不同的行(如使用json_each時)是最不需要的 –

回答

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文檔分解成關鍵(文本)和值(標量或更復雜的JSON文件)然後JOIN,將其分解到分解參數數組中包含的鍵,最後將匹配聚合成新的json文檔。

請注意,如果您使用的是jsonb類型,則應使用jsonb_*變體調用所有函數。

+0

我在這裏看到的問題是,您需要傳遞一個json作爲關鍵,這不是OP所需的。我認爲如果你改變第二個參數到varchar數組中,並使用unnest函數,那將是好的 –

+1

@JorgeCampos OP沒有具體說明(儘管單引號提示數組),但是看到MongoDB在整個​​傳遞過程中使用'json'作爲'json'文檔的感興趣的鍵似乎是有意義的。但是對於一個數組和'unnest()'而不是'json_array_elements()'來說,它可以很好地工作。 – Patrick

0

這裏是我的嘗試:

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'); 

你會得到

{"a": "someAvalue", "c": 1} 
相關問題