例: JSONデータの更新

これは、jsonドキュメントの異質性の処理の例です。Peoples表に、前の例の行と、次の行が含まれていると仮定します。

INSERT INTO People VALUES (
    1,
    {
        "firstName":"Jane",
        "lastName":"Doe",
        "address": {
            "city": "Santa Cruz",
            "state" : "CA",
            "phones" : [
                { "areacode":831, "number":5294368, "kind":"mobile" }
            ]
        }
    }
);

Janeには、配列内に格納されず、単一の電話オブジェクトとして格納されている単一の電話があります。個人の電話を追加する更新問合せを作成します。この問合せはどの行でも機能する必要があり、一部の行では電話が配列として格納され、他の行では単一のjsonオブジェクトとして格納されます。次のとおりです。

DECLARE $id INTEGER;
$areacode INTEGER;
$number INTEGER;
$kind STRING;

UPDATE People p
ADD p.info.address[$element.phones IS OF TYPE (ARRAY(any))].phones
    { "areacode" : $areacode, "number" : $number, "kind" : $kind },
SET p.info.address[$element.phones is of type (map(any))].phones =
    [ $, { "areacode" : $areacode, "number" : $number, "kind" : $kind } ]
WHERE id = $id;
ADD句で、式p.info.address[$element.phones is of type (array(any))].phonesは、住所の電話フィールドが配列かどうかをチェックし、配列である場合はその配列を返し、それがADDのターゲットになります。addの2番目の式は、jsonオブジェクト・コンストラクタです。これは、新しい電話オブジェクトを作成し、それをターゲット配列に追加します。

注意:

p.info.addressは配列ではありませんが、配列フィルタリング・ステップがターゲット式で適用されます。これは、(配列フィルタ・ステップ式の項で説明しているように)住所は唯一の要素として住所を含む配列として扱われるため、正常に機能します。その結果、$elementが住所項目にバインドされ、フィルタリング条件がtrueの場合、住所項目はパス式の次のステップへの入力となります。

SET句では、最初の式が住所の電話フィールドがjsonオブジェクトであるかどうかをチェックし、そうである場合は、その電話オブジェクトを返し、それがSETのターゲットになります。2番目の式は、2つのjsonオブジェクトを持つ新しい配列を作成します。1つ目は既存の電話オブジェクト、2つ目は新しく作成された電話オブジェクトです。その後、ターゲット・オブジェクトが新しく作成された配列で置換されます。