Microsoft Fabric のミラー化されたデータベースを使用して、Azure Cosmos DB for NoSQL からソース化された入れ子になった JSON データに対してクエリを実行します。
[前提条件]
- 既存の Azure Cosmos DB for NoSQL アカウント。
- Azure サブスクリプションをお持ちでない場合は、 Azure Cosmos DB for NoSQL を無料で試してください。
- 既存の Azure サブスクリプションがある場合は、 新しい Azure Cosmos DB for NoSQL アカウントを作成します。
- 既存のファブリック容量。 既存の容量がない場合は、 Fabric 試用版を開始します。
- Azure Cosmos DB for NoSQL アカウントは、ファブリック ミラーリング用に構成する必要があります。 詳細については、 アカウント要件を参照してください。
ヒント
バックアップから迅速に復旧できる既存の Azure Cosmos DB データのテストまたは開発コピーを使用することをお勧めします。
ソース データベース内に入れ子になったデータを作成する
入れ子になった JSON データのさまざまなレベルを含む JSON 項目を Azure Cosmos DB for NoSQL アカウント内に作成します。
Azure portal で Azure Cosmos DB アカウントに移動します。
リソース メニューから [データ エクスプローラー ] を選択します。
+ 新しいコンテナーを使用して新しいコンテナーを作成します。 このガイドでは、コンテナーに
TestCという名前を付けます。 対応するデータベース名は任意です。[+ 新しい項目] オプションを複数回使用して、これら 5 つの JSON 項目を作成して保存します。
{ "id": "123-abc-xyz", "name": "A 13", "country": "USA", "items": [ { "purchased": "11/23/2022", "order_id": "3432-2333-2234-3434", "item_description": "item1" }, { "purchased": "01/20/2023", "order_id": "3431-3454-1231-8080", "item_description": "item2" }, { "purchased": "02/20/2023", "order_id": "2322-2435-4354-2324", "item_description": "item3" } ] }{ "id": "343-abc-def", "name": "B 22", "country": "USA", "items": [ { "purchased": "01/20/2023", "order_id": "2431-2322-1545-2322", "item_description": "book1" }, { "purchased": "01/21/2023", "order_id": "3498-3433-2322-2320", "item_description": "book2" }, { "purchased": "01/24/2023", "order_id": "9794-8858-7578-9899", "item_description": "book3" } ] }{ "id": "232-abc-x43", "name": "C 13", "country": "USA", "items": [ { "purchased": "04/03/2023", "order_id": "9982-2322-4545-3546", "item_description": "clothing1" }, { "purchased": "05/20/2023", "order_id": "7989-9989-8688-3446", "item_description": "clothing2" }, { "purchased": "05/27/2023", "order_id": "9898-2322-1134-2322", "item_description": "clothing3" } ] }{ "id": "677-abc-yuu", "name": "D 78", "country": "USA" }{ "id": "979-abc-dfd", "name": "E 45", "country": "USA" }
ミラーリングと前提条件の設定
Azure Cosmos DB for NoSQL データベースのミラーリングを構成します。 ミラーリングを構成する方法がわからない場合は、ミラー 化されたデータベースの構成に関するチュートリアルを参照してください。
Fabric ポータルに移動します。
Azure Cosmos DB アカウントの資格情報を使用して、新しい接続とミラー化されたデータベースを作成します。
レプリケーションがデータの初期スナップショットを完了するまで待ちます。
入れ子になった基本的なデータに対してクエリを実行する
次に、SQL 分析エンドポイントを使用して、単純な入れ子になった JSON データを処理できるクエリを作成します。
ファブリック ポータルでミラー化されたデータベースに移動します。
ミラー化された Azure Cosmos DB から SQL 分析エンドポイントに切り替えます。
テスト テーブルのコンテキスト メニューを開き、[新しい SQL クエリ] を選択します。
このクエリを実行して、
itemsを使用してOPENJSON配列を展開します。 このクエリでは、OUTER APPLYを使用して、項目配列がない可能性がある追加の項目を含めます。SELECT t.name, t.id, t.country, P.purchased, P.order_id, P.item_description FROM OrdersDB_TestC AS t OUTER APPLY OPENJSON(t.items) WITH ( purchased datetime '$.purchased', order_id varchar(100) '$.order_id', item_description varchar(200) '$.item_description' ) as Pヒント
OPENJSONでデータ型を選択する場合、文字列型にvarchar(max)を使用すると、クエリのパフォーマンスが低下する可能性があります。 代わりに、任意varchar(n)数値n使用します。nが低いほど、クエリのパフォーマンスが向上する可能性が高くなります。次のクエリで
CROSS APPLYを使用して、items配列を持つ項目のみを表示します。SELECT t.name, t.id, t.country, P.purchased, P.order_id, P.item_description FROM OrdersDB_TestC as t CROSS APPLY OPENJSON(t.items) WITH ( purchased datetime '$.purchased', order_id varchar(100) '$.order_id', item_description varchar(200) '$.item_description' ) as P
自動スキーマ推論を使用して、入れ子になった基本的なデータのクエリを実行する
前の例の手順 1 から 3 に従います。 同じデータ セットを使用すると、スキーマを明示的に定義しなくても、データをフラット化するクエリを作成できます。
スキーマを定義せずに
itemsを使用してOPENJSON配列を展開するには、このクエリを実行します。 これにより、入れ子になった各オブジェクトを新しい行に分離することで、項目配列が 1 レベルフラット化されます。SELECT t.name, t.id, t.country, p.* FROM OrdersDB_TestC as t CROSS APPLY OPENJSON(t.items) pスキーマを定義せずに
itemsを使用してOPENJSON配列をさらに拡張するには、このクエリを実行します。 これにより、入れ子になった各オブジェクト内の各プロパティを新しい行に分離することで、項目配列の 2 つのレベルがフラット化されます。SELECT t.name, t.id, t.country, q.* FROM OrdersDB_TestC as t CROSS APPLY OPENJSON(t.items) q OUTER APPLY OPENJSON(t.items) p
深く入れ子になったデータを作成する
この入れ子になったデータの例を基にして、深く入れ子になったデータの例を追加しましょう。
Azure portal で Azure Cosmos DB アカウントに移動します。
リソース メニューから [データ エクスプローラー ] を選択します。
+ 新しいコンテナーを使用して新しいコンテナーを作成します。 このガイドでは、コンテナーに
TestDという名前を付けます。 対応するデータベース名は任意です。[+ 新しい項目] オプションを複数回使用して、この JSON 項目を作成して保存します。
{ "id": "eadca09b-e618-4090-a25d-b424a26c2361", "entityType": "Package", "packages": [ { "packageid": "fiwewsb-f342-jofd-a231-c2321", "storageTemperature": "69", "highValue": true, "items": [ { "id": "1", "name": "Item1", "properties": { "weight": "2", "isFragile": "no" } }, { "id": "2", "name": "Item2", "properties": { "weight": "4", "isFragile": "yes" } } ] }, { "packageid": "d24343-dfdw-retd-x414-f34345", "storageTemperature": "78", "highValue": false, "items": [ { "id": "3", "name": "Item3", "properties": { "weight": "12", "isFragile": "no" } }, { "id": "4", "name": "Item4", "properties": { "weight": "12", "isFragile": "no" } } ] } ], "consignment": { "consignmentId": "ae21ebc2-8cfc-4566-bf07-b71cdfb37fb2", "customer": "Humongous Insurance", "deliveryDueDate": "2020-11-08T23:38:50.875258Z" } }
深く入れ子になったデータに対してクエリを実行する
最後に、JSON 文字列で深く入れ子になったデータを検索できる T-SQL クエリを作成します。
TestDテーブルのコンテキスト メニューを開き、もう一度 [新しい SQL クエリ] を選択します。このクエリを実行して、委託品で
OUTER APPLYを使用して、入れ子になったデータのすべてのレベルを展開します。SELECT P.id, R.packageId, R.storageTemperature, R.highValue, G.id, G.name, H.weight, H.isFragile, Q.consignmentId, Q.customer, Q.deliveryDueDate FROM OrdersDB_TestD as P CROSS APPLY OPENJSON(P.packages) WITH ( packageId varchar(100) '$.packageid', storageTemperature INT '$.storageTemperature', highValue varchar(100) '$.highValue', items nvarchar(MAX) AS JSON ) as R OUTER APPLY OPENJSON (R.items) WITH ( id varchar(100) '$.id', name varchar(100) '$.name', properties nvarchar(MAX) as JSON ) as G OUTER APPLY OPENJSON(G.properties) WITH ( weight INT '$.weight', isFragile varchar(100) '$.isFragile' ) as H OUTER APPLY OPENJSON(P.consignment) WITH ( consignmentId varchar(200) '$.consignmentId', customer varchar(100) '$.customer', deliveryDueDate Date '$.deliveryDueDate' ) as Q注
packages展開すると、itemsは JSON として表され、必要に応じて展開できます。itemsプロパティには JSOn としてサブプロパティがあり、必要に応じて展開することもできます。最後に、特定のレベルの入れ子を拡張するタイミングを選択するクエリを実行します。
SELECT P.id, R.packageId, R.storageTemperature, R.highValue, R.items, Q.consignmentId, Q.customer, Q.deliveryDueDate FROM OrdersDB_TestD as P CROSS APPLY OPENJSON(P.packages) WITH ( packageId varchar(100) '$.packageid', storageTemperature INT '$.storageTemperature', highValue varchar(100) '$.highValue', items nvarchar(MAX) AS JSON ) as R OUTER APPLY OPENJSON(P.consignment) WITH ( consignmentId varchar(200) '$.consignmentId', customer varchar(100) '$.customer', deliveryDueDate Date '$.deliveryDueDate' ) as Q注
入れ子になったレベルのプロパティ制限は、この T-SQL クエリ エクスペリエンスでは適用されません。