マップの操作

マップに適用可能なパス・ステップが、フィールド・ステップおよびフィルタ・ステップです。マップは順序付けされておらず、そのためマップのエントリには固定位置がないため、スライス・ステップはマップでは意味がありません。

フィールド・ステップを使用して、マップからフィールドの値を選択できます。たとえば、すべての個人の姓および食品の支出を戻すには、次のようにします。

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