REST APIを使用したJSON Relational Dualityビューの問合せ (2024/08/21)
REST APIを使用したJSON Relational Dualityビューの問合せ (2024/08/21)
https://www.thatjeffsmith.com/archive/2024/08/querying-json-relational-duality-views-via-rest-apis/
REST API から返される JSON オブジェクトの配列は次のようになります。

私のDVはRESTが有効になっているため(どのビューやテーブルでも同じプロセスです)、ords/hr/empsplusboss_dv/エンドポイントを使用してデータを取得するだけで済みます。
上司の名前がスティーブンである従業員だけをどうやって集めればいいのでしょうか?
SQLで解決するのは当然のことかもしれませんが、RESTと組み込みのフィルタリング機能を使えば、いかに簡単にできるかをお見せしたいと思います。
この記事では、以下のことを前提とします。
- 23aiはOracle Databaseの最新バージョンです。
- その主要な機能の1つはJSON Duality Viewsビューです
- ORDSはAutoRESTを介してREST APIをサポートします。
- VS Code 用のSQL Developer 拡張機能を使えば簡単に構築できます
私たちの二元論的見解
最近私が試行錯誤している例、つまりEMPLOYEESテーブルで自己結合したデータ変数(DV)を使います。このDVは、従業員オブジェクトの配列と、それぞれの従業員のマネージャー名を提供します。
VS Codeでこれを構築していたときは、こんな感じでした。

DV経由で全従業員とその上司を逮捕する
「ルート」から始めるのが良いでしょう。つまり、次のようにベースオブジェクトに対してGETリクエストを実行することです。

でも、上司の名前が「スティーブン」の従業員だけを抽出したいんです。どうすればいいでしょうか?これは私が以前にも何度も紹介してきた方法と非常によく似ていて、「私のお気に入りのORDS機能!」とまで呼んでいます。
例えば EMPLOYEES テーブルのような TABLE や VIEW といったリレーショナル オブジェクトを扱っていて、すべての従業員が必要ない場合は、単純に次のことができます。
GET ords/employees/?q={“job_id”:{“$like”:”%CLERK”},”salary”:{“$gt”:2899}}
または英語/SQLでは、
SELECT *
FROM EMPLOYEES
WHERE JOB_ID LIKE '%CLERK'
and SALARY > 2899
しかし、現在扱っているのはJSONオブジェクトであり、配列やオブジェクト、ネストされたオブジェクトなどを含む複雑な構造を持つ場合があります。そのため、より強力なクエリ言語が必要になります。でもご安心ください、既に用意してあります!
Duality Viewsとフィルタリングは少し異なります…
{
"_id": 103,
"firstName": "Alexander",
"lastName": "James",
"compensation": {
"sal": 9000,
"comm": null
},
"boss": {
"boss_id": 102,
"boss_name": {
"firstName": "Lex",
"lastName": "Garcia"
}
}
}シンプルな JSON 値ペアで構成されるオブジェクト boss があり、それに続いて別のオブジェクト boss_name があります。
これを照会するには、Oracle Databaseで提供されている非常にシンプルな「ドット表記法」を使用する必要があります。
ORDS AutoREST ドキュメントのこの行がこれを裏付けています。以下を参照してください。

では、「SODA拡張QBE構文」とは何でしょうか?
以前にもブログで、SODAコレクションに保存された映画を使ってこのことについて書いたことがあります。
すべてをまとめると
Duality View の boss.boss_name.first_Name に対して等価フィルタを実行したいのですが、これは簡単に構築できます。ほぼ「ツリーをたどる」だけです。

さあ、従業員を雇い入れよう!
GET ords/hr/empsplusboss_dv/?q={“boss.boss_name.firstName”:{“$eq”:”Steven”}}

でも待って、これはつまらない。もっと現実世界で使われそうなものはどうだろう?
私はまず退屈でシンプルなことから始めて、そこから徐々に規模を拡大していくのが好きです。それに、Duality Viewsで自己参照テーブル結合を使ってJSONオブジェクトを構築できるのは素晴らしいと思いました。
しかし、鋭い観察眼をお持ちの読者様には、一点加点とさせていただきます。
Duality View を介して STUDENT_SCHEDULE オブジェクトを取得しました。これは次のようになります。

そして、このREST対応のDuality Viewに対してGETリクエストを実行すると、データは次のように返されます。

Duality Viewは複数のテーブルから取得したデータで構成されており、それらのテーブルの中にはJSON形式の列を持つものもあります。
MATH_01コースが含まれている学生の時間割だけを表示したいです。
GET …ords/schools/student_schedule/?q={“schedule.courseName”:{“$eq”:”MATH_01″}}

コメント
コメントを投稿