私はあなたが望むものを部分的にしか解決できませんでした (以下のコードを参照)。配列(配列としてのパス)を含むコンポジットに挿入できましたが、コンポジットの配列(配列としてのlangpath)には挿入できませんでした。
プレーンSQLでは、これは可能に見えます-私のクエリが正しい場合=)(下部のコードを参照)。したがって、これは PLV8 の準備/実行の問題である可能性があります。
私は個人的にこのモデルを複数のテーブルに分割し、データベースに得意なことをさせます。または、あるレベルで json を使用するだけかもしれません。ネストされた構造の方が適していて、すでに JavaScript エンジン (PLV8) が利用可能です。Postgresql (バージョン 9.5 以降) は、PLV8 なしで json を非常に適切にサポートしています。9.2 から 9.4 では、json の操作のサポートは限定的でした。ドキュメントの基本的なインデックス作成も実行できるようになりました (GIN を使用)。
これが私ができたことの完全なコードです。langpathの配列が欠落していることに注意してください。
-- Installed plv8 via apt (Ubuntu 15.10) for Postgresql9.5
--CREATE EXTENSION plv8;
DROP SCHEMA IF EXISTS mydb CASCADE;
CREATE SCHEMA mydb;
CREATE TYPE mydb.langpath AS (
lang text,
path text[]
);
CREATE TABLE mydb.paths (
info text NOT NULL,
langpath mydb.langpath
);
DO LANGUAGE plv8 $$
var plan=plv8.prepare("INSERT INTO mydb.paths(info, langpath) VALUES($1, $2)", ['text', 'mydb.langpath'] );
var params=new Array();
params.push('infotext');
var pts=[];
pts.push('englishPath1');
pts.push('englishpath2');
params.push({lang:"EN",path:pts});
plan.execute(params);
$$
SELECT path FROM (SELECT (langpath).* FROM mydb.paths) a;
/*
row | path (text[])
-----|-------------------------------
1 | {englishPath1,englishpath2}
*/
SELECT path[1] FROM (SELECT (langpath).* FROM mydb.paths) a;
/*
row | path (text)
-----|-------------------------------
1 | englishPath1
*/
完全を期すために、ネストされた配列から値を選択するクエリの例とともに、プレーン SQL を介して元のテーブル定義に挿入することをテストするコードを次に示します。
INSERT INTO mydb.paths(info, langpath) VALUES('infotext',
( array[
row('EN', array['englishPath1', 'englishPath2']),
row('FR', array['frenchPath1', 'frenchPath2'])
]::mydb.langpath[]
)
);
SELECT path[2] FROM (
SELECT (langpath).* FROM (
SELECT langpath[1] FROM mydb.paths
) a
) b