マップの操作
マップに適用可能なパス・ステップが、フィールド・ステップおよびフィルタ・ステップです。マップは順序付けされておらず、そのためマップのエントリには固定位置がないため、スライス・ステップはマップでは意味がありません。
フィールド・ステップを使用して、マップからフィールドの値を選択できます。たとえば、すべての個人の姓および食品の支出を戻すには、次のようにします。
sql-> SELECT lastname, p.expenses.food
FROM Persons p;
+----------+------+
| lastname | food |
+----------+------+
| Morgan | 2000 |
| Morrison | 1000 |
| Scully | 900 |
| Smith | 6000 |
| Anderson | 1700 |
+----------+------+
5 rows returned
前述の問合せでは、パス式p.expenses.food
は2つのフィールド・ステップで構成されています。.expenses
は、現在の行のexpensesフィールドを選択し、.food
は現在のexpensesマップからfoodフィールド/エントリの値を選択します。
食品への支出額が$3000未満の各個人について、姓と旅行への支出額を戻すには、次のようにします。
sql-> SELECT lastname, p.expenses.travel
FROM Persons p WHERE p.expenses.food < 3000;
+----------+--------+
| lastname | travel |
+----------+--------+
| Scully | NULL |
| Morgan | 700 |
| Anderson | 2100 |
| Morrison | NULL |
+----------+--------+
4 rows returned
旅行の支出がまったくない個人に対してはNULLが戻されることに注意してください。
フィルタ・ステップは、.values()
または.keys()
のいずれかのパス・ステップを使用して実行されます。マップ・エントリの値を選択するには、.values(<cond>)
を使用します。マップ・エントリのキーを選択するには、.keys(<cond>)
を使用します。これらのステップで条件が使用されていない場合は、入力マップのすべての値またはキーが選択されます。ステップに条件式が含まれている場合は、各エントリに対して条件が評価され、結果がtrueの場合はエントリの値またはキーが選択され、結果がfalseの場合はスキップされます。
暗黙的に宣言される変数$keyおよび$valueをマップ・フィルタ条件内で使用できます。$keyは現在のエントリのキーを参照し、$valueは関連する値を参照します。配列とは異なり、$pos変数はマップ・フィルタ内では使用できないことに注意してください(マップ・エントリには固定位置がないため)。
ユーザーごとに、そのIDと支出額が$1000を超えているexpenseカテゴリを表示するには、次のようにします。
sql-> SELECT id, p.expenses.keys($value > 1000) as Expenses
from Persons p;
+----+---------------------+
| id | Expenses |
+----+---------------------+
| 4 | clothes |
| | food |
| | shoes |
+----+---------------------+
| 3 | food |
+----+---------------------+
| 2 | food |
| | travel |
+----+---------------------+
| 5 | clothes |
+----+---------------------+
| 1 | NULL |
+----+---------------------+
ユーザーのIDと、ユーザーの支出額が衣服よりも多いexpenseカテゴリを戻すには、次のフィルタ・ステップ式を使用します。この問合せでは、フィルタ・ステップ式[$value > $.clothes]に含まれるコンテキスト項目変数($)がexpensesマップ全体を参照しています。
sql-> SELECT id, p.expenses.keys($value > $.clothes) FROM Persons p;
+----+---------------------+
| id | Column_2 |
+----+---------------------+
| 3 | NULL |
+----+---------------------+
| 2 | NULL |
+----+---------------------+
| 5 | NULL |
+----+---------------------+
| 1 | NULL |
+----+---------------------+
| 4 | food |
+----+---------------------+
食品よりも支出額が多いカテゴリがあるすべての個人のIDと支出データを戻すには、次のようにします。
sql-> SELECT id, p.expenses
FROM Persons p
WHERE p.expenses.values() >any p.expenses.food;
+----+---------------------+
| id | expenses |
+----+---------------------+
| 5 | clothes | 1500 |
| | food | 900 |
| | shoes | 1000 |
+----+---------------------+
| 2 | books | 100 |
| | food | 1700 |
| | travel | 2100 |
+----+---------------------+
2 rows returned
食品以外で支出額が$2000を超えるカテゴリがあるすべての個人のIDを戻すには、次のようにします。
sql-> SELECT id FROM Persons p
WHERE p.expenses.values($key != "food") >any 2000;
+----+
| id |
+----+
| 2 |
+----+
1 row returned