3.4 二面性ビューでのネストおよびネスト解除

二面性ビューの基礎となる表には、ビューでサポートされているドキュメントのフィールドが生成されます。ルート以外の表の列では、(1)その表に固有のオブジェクトにフィールドを生成(ネスト)することも、(2)親表に固有のオブジェクトにフィールドを生成(ネスト解除)することもできます。

二面性ビューの基礎となる列は、通常はSQLスカラー型(VARCHAR2NUMBERなど)であり、それにマップされているフィールドは対応するJSONスカラー型(文字列、数値など)です。

ルート以外の表の列によって生成されるドキュメント・フィールドを配置する方法には、次の2つがあります:脚注2

  • 自分のオブジェクトにフィールドを配置します。これは親オブジェクトのフィールドの値になります。ビュー定義には、表のこのネスト・フィールドを指定します。たとえば、例3-2のフィールドteamInfoは、表teamのネスト・フィールドです。

    この場合、表、その列、およびそれらの列に対応するフィールドを、そのネスト・フィールドの値として親オブジェクトにネストされているものとして普通に述べています。

  • フィールドを親オブジェクトに直接追加します。この場合、ビュー定義にネスト・フィールドの名前は指定しません。ネスト・フィールドのかわりに、キーワードUNNESTを定義に指定します。例3-3および例3-7に、これを示します。

(キーワードUNNESTがない)ネストがデフォルトの動作です。

基礎となる表の(フレックスでない)JSONの列は、スカラー型の列と同じ方法で処理されます。

表がネストされている場合、JSON型の列にマップされたフィールドは、親オブジェクトのネスト・フィールドの値であるオブジェクトに含まれます。

たとえば、親オブジェクトのネスト・フィールドがinfoで、JSON型の列に値25があり、フィールドareaにマップされている場合、フィールドinfoの値は、フィールドareaを含むオブジェクトになります:

{..., "info" : {..., "area":25, ...}}

表がネスト解除されている場合は、フィールドareaが親オブジェクトに配置され、ネスト・フィールドinfoはありません:

{..., "area":25, ...}

JSON型の列の値がオブジェクトの場合は、何も変わりません。たとえば、列にマップされたareaフィールドに値{"width":2, "length":3}がある場合は、ネストによって次が生成されます:

{..., "info" : {..., "area":{"width":2, "length":3}, ...}}

そして、ネスト解除によって次が生成されます:

{..., "area":{"width":2, "length":3}, ...}

次に、フレックス列について考えてみます(二面性ビューでのJSON列によるスキーマ柔軟性を参照)。フレックス列JSON型の列であり、その値は常にオブジェクトで、その目的は認識されていない新しい受信フィールドのコンテナになることです。

つまり、フレックス列に含まれるフィールドは、二面性ビューの一部として最初は定義されていません。これらは、ビューでサポートされているドキュメントをアプリケーションが挿入および更新するときにその場で作成されます。

フレックス列の値は常にオブジェクトであるため、フレックス列のデータは常にネストされません。これはその列が1列のみの表であるのと同じようなものです。フレックス列自体はネスト・フィールドにマップされず、そこに格納されるオブジェクトのフィールドは親オブジェクトに直接配置されます。

フレックス列のこのネスト解除のことを、親オブジェクトへのフィールドのマージと呼びます。

たとえば、フレックス列stuffに次のオブジェクトが含まれているとします:

{"width":2, "length":3}

そのオブジェクトの各フィールドか親オブジェクトにマージされます:

{..., "width":2, "length":3, ...}

これは、フレックス列を含む表自体がネストされているか、ネストされていないかに関係なく発生します。つまり、フレックス列のマージは、同じ表内のスカラー列がネストされているか、ネストされていないかとは無関係です。



脚注一覧

脚注1: ここでは、非表示のフィールドや、値が生成されるフィールドなど、列にマッピングされるフィールド以外の可能性は無視しています。(そのようなフィールドの詳細は、生成フィールド、非表示フィールドを参照してください。)
脚注2: ネストもネスト解除もルート表の列には当てはまりません。これらのフィールドは、結果となるオブジェクトの最上位レベルに配置されるので、親はありません。