例: 行の更新
CREATE TABLE People (
id INTEGER,
info JSON,
PRIMARY KEY(id));
INSERT INTO People VALUES (
0,
{
"firstName":"John",
"lastName":"Doe",
"profession":"software engineer",
"income":200000,
"address": {
"city" : "San Fransisco",
"state" : "CA",
"phones" : [
{ "areacode":415, "number":2840060, "kind":"office" },
{ "areacode":650, "number":3789021, "kind":"mobile" },
{ "areacode":415, "number":6096010, "kind":"home" }
]
},
"children": {
"Anna" : {
"age" : 10,
"school" : "school_1",
"friends" : ["Anna", "John", "Maria"]
},
"Ron" : { "age" : 2 },
"Mary" : {
"age" : 7,
"school" : "school_3",
"friends" : ["Anna", "Mark"]
}
}
}
);
次のupdate文は、前述の行の様々なフィールドを更新します。
UPDATE People p
SET p.info.profession = "surfing instructor",
SET p.info.address.city = "Santa Cruz",
SET p.info.income = p.info.income / 10,
SET p.info.children.values().age = $ + 1,
ADD p.info.address.phones
0 { "areacode":831, "number":5294368, "kind":"mobile" },
REMOVE p.info.address.phones [$element.kind = "office"],
PUT p.info.children.Ron { "friends" : ["Julie"] },
ADD p.info.children.values().friends seq_concat("Ada", "Aris")
WHERE id = 0
RETURNING *;
更新後、行は次のようになります。
{
"id":0,
"info":{
"firstName":"John",
"lastName":"Doe",
"profession":"surfing instructor",
"income":20000,
"address":{
"city":"Santa Cruz",
"phones":[
{"areacode":831,"kind":"mobile","number":5294368},
{"areacode":650,"kind":"mobile","number":3789021},
{"areacode":415,"kind":"home","number":6096010}
],
"state":"CA"
},
"children":{
"Anna":{
"age":11,
"friends":["Anna","John","Maria","Ada","Aris"],
"school":"school_1"
},
"Ron":{
"age":3,
"friends":["Julie","Ada","Aris"]
},
"Mary":{
"age":8,
"friends":["Anna","Mark","Ada","Aris"],
"school":"school_3"
}
}
}
}
最初の2つのSET句によって、John Doeの職業と都市が変更されます。3番目のSETは、収入を10分の1に削減します。4番目のSETは、子の年齢を1増やします。ここで$変数を使用することに注意してください。式p.info.children.values().ageは3つの年齢を返します。SETはこれらの年齢を繰り返し処理し、$変数を各年齢にバインドし、年齢ごとに式$+ 1を計算し、新しい値で年齢を更新します。収入の更新に$変数を使用して、set p.info.income = $ / 10とすることもできます。これによって、「=」の右側のp.info.incomeパスの再評価が節約されます。
ADD句は、phones配列内の位置0に新しい電話を追加します。REMOVEは、すべてのオフィスの電話(この例では1つのみ)を削除します。PUT句はRonの友人を追加します。この句では、式p.info.children.RonはRonの子に関連付けられた値を返します。この値はマップ(jsonオブジェクト{ "age" : 3 })であり、更新のターゲットになります。PUTの2番目の式({ "friends" : ["Julie"] })は、新しいマップを作成して返します。このマップのフィールドがターゲット・マップに追加されます。最後に、最後のADD句は、同じ2人の新しい友人をそれぞれの子に追加します。any* seq_concat(any*, ...)関数を参照してください。
この例の更新問合せは、JSON型ではなく、info列に次のRECORD型がある場合にまったく同じであることに注意してください。
RECORD(
firstName STRING,
lastName STRING,
profession STRING,
income INTEGER,
address RECORD(
city STRING,
state STRING,
phones ARRAY(
RECORD(
areacode INTEGER,
number INTEGER,
kind STRING
)
)
),
children MAP(
RECORD(
age INTEGER,
school STRING,
friends ARRAY(STRING)
)
)
)