ページには、MongoDB クエリの例が示されています。SQL構文を使用してコレクションをクエリする基本的な例と、FLATTEN と UNWIND を使用してネストされたデータを処理するより高度な例を示します。
サンプル クエリ
高度な構成サンプルフェデレーティッドデータベースインスタンスに対して次の MongoDB クエリを実行中てみてください。または、独自のデータを読み取るように変更します。
注意
これらの例では、短縮形式の構文を使用します。
SELECT ステートメント
SELECT * FROM sessions;
MongoDB は Sessionsコレクションのすべてのドキュメントを返します。
制限ステートメント
SELECT * FROM users LIMIT 2;
MongoDB は Usersコレクションから 2 つのドキュメントを返します。
WHERE ステートメント
SELECT * FROM users WHERE name = 'Jon Snow';
MongoSQL は、ユーザーの name が Jon Snow であるドキュメントを Usersコレクションから返します。
With キーワード
WITH キーワードを使用すると、後で使用するための派生データソースの作成が簡単になります。
WITH RecentSales AS ( SELECT customer_id, SUM(amount) AS total_sales FROM sales WHERE sale_date > '2025-01-01' GROUP BY customer_id ) SELECT customer_id, total_sales FROM RecentSales WHERE total_sales > 1000;
MongoDB は、1、2025 年 1 月 日以降の合計売上額が 1000 を超える customer_id を持つドキュメントを Salesコレクションから返します。
FLATTEN と UNIX をする
このセクションでは、ドキュメント構造の操作を容易にする 2 つの MongoDB 機能について説明します。これらは MongoSQL に固有です。
FLATTEN
FLATTEN 半構造化データ(JSON 内の名前と値のペア)を別々の列にフラット化します。 フィールド名は、そのフィールドのすべての値を行に保持する列名になります。
ネストされたドキュメントをフラット化するための構文は、データソースと オプションと組み合わせてFROM句で使用できるFLATTEN関数です。
SELECT * FROM FLATTEN(<data source> WITH DEPTH => <integer>, SEPARATOR => <string> )
変数 | 必要性 | 説明 |
|---|---|---|
<data source> | 必須 | データソースをフラット化する |
| 任意 | フラット化するサブドキュメントのレベル数を示す正の整数。 デフォルトでは、すべてのレベルのサブドキュメントがフラット化されます。 |
| 任意 | フィールド名を連結するときに区切り文字として使用するstring 。 デフォルトは |
平面の例
サンプルシナリオでは、 customerInfoコレクションには次のように構造されたドキュメントが含まれています。
{ id: 1, location: "New York", customer: { age: 50, email: "customer@email.com", satisfaction: 5 } }
クエリ SELECT * FROM customerInfo を実行すると、MongoSQL は次の最上位フィールドを持つドキュメントを返します。
| 1 |
| "New Collection" |
| {経過時間: 50、メール: "customer@email.com"、満足度: 5 } |
クエリ SELECT * FROM FLATTEN(customerInfo) を実行すると、MongoSQL は次の最上位フィールドを持つドキュメントを返します。
| 1 |
| "New Collection" |
| 50 |
| "customer@email.com" |
| 5 |
FLATTENを使用すると、元のドキュメントの各フラット化フィールドは結果セットの最上位フィールドになります。 ネストされたフィールドは親フィールド名と連結され、デフォルトの区切り文字_で区切られます。
UNWIND
UNWIND 入力データソースから配列フィールドを分解して、その配列内の各項目に対して 1 行を出力します。 展開の詳細については、 $unwind集計ステージのドキュメントを参照してください。
配列フィールドを展開する構文は、データソースと オプションと組み合わせてFROM句で使用できるUNWIND関数です。
SELECT * FROM UNWIND(<data source> WITH PATH | PATHS => <array_paths>, INDEX => <identifier>, OUTER => <bool> )
変数 | 必要性 | 説明 |
|---|---|---|
<data source> | 必須 | 展開する配列フィールドのソース。 |
| 必須 | 展開するデータソース内のフィールドへのパス。複数のパスを指定するには、括弧を使用します。 |
| 任意 | インデックス列を割り当てる名前。省略した場合、MongoSQL はインデックスフィールドを作成しません。 |
| 任意 | null、欠落、または空の配列値を持つドキュメントが保持されるかどうかを示すフラグ。 |
展開例: 最上位フィールド
サンプルシナリオでは、 customerInfoコレクションには次のように構造されたドキュメントが含まれています。
{ id: 1, location: "New York", customer: { age: 50, email: "customer@email.com", satisfaction: 5 }, visits: [ { year: 2020, score: 10 }, { year: 2021, score: 8 }, { year: 2022 score: 7 } ] }
クエリ SELECT * FROM customerInfo を実行すると、MongoSQL は次の最上位フィールドを持つドキュメントを返します。
| 1 |
| "New Collection" |
| {経過時間: 50、メール: "customer@email.com"、満足度: 5 } |
| [ { 年: 2020 、スコア: 10 }、{ 年: 2021 、スコア: 8 }、{ 年: 2022 、スコア: 7 } |
クエリ SELECT * FROM UNWIND(customerInfo WITH PATH => visits, INDEX => idx) を実行すると、MongoSQL は次の最上位フィールドを持つドキュメントを返します。
| 1 | 1 | 1 |
| "New Collection" | "New Collection" | "New Collection" |
| {経過時間: 50、メール: "customer@email.com"、満足度: 5 } | {経過時間: 50、メール: "customer@email.com"、満足度: 5 } | {経過時間: 50、メール: "customer@email.com"、満足度: 5 } |
| 0 | 1 | 2 |
| { 年: 2020 、スコア: 10 } | { 年: 2021 、スコア: 8 } | { 年: 2022 、スコア: 7 } |
UNWINDとPATH => visitsを併用すると、各visitsオブジェクトはテーブル行になります。
展開例: ネストされた配列と保存配列の展開
サンプルシナリオでは、 customerInfoコレクションには次のように構造されたドキュメントが含まれています。
{ "id": 1, "location": "New York", "customer": { "age": 50, "email": "customer@email.com", "satisfaction": 5 }, "visits": [ { "year": 2020, "score": 10 }, { "year": 2021, "score": 8 }, { "year": 2022, "score": 7 } ], "purchases": [ { "transaction": "1A", "transactions": [ { "amount": 100 }, { "amount": 150 } ] }, { "transaction": "2B", "transactions": [ { "amount": 200 } ] } ] }
次のクエリを実行するとします。
SELECT v.year AS visit_year, v.score AS visit_score, p.transaction AS transaction_id, t.amount AS purchase_amount FROM UNWIND( customerInfo WITH PATHS => ( visits[INDEX => visit_idx], purchases[OUTER => TRUE, INDEX => purchase_idx].transactions[] ), INDEX => idx, OUTER => FALSE )
上記のクエリでは、次の処理が行われます。
visits配列を展開し、展開した配列内のインデックス位置を追跡するためにインデックス名visit_idxを割り当てます。各
purchasesオブジェクト内でpurchases配列を展開し、transactions配列を展開します。また、OUTER => TRUEを使用して、transactions配列が欠落しているか空である購入を保持します。
MongoSQL では、次のフィールドを持つドキュメントが返されます。
visit_year | visit_score | transaction_id | purchase_amount |
|---|---|---|---|
2020 | 10 | 1A | 100 |
2020 | 10 | 2B | 150 |
2021 | 8 | 1A | 100 |
2021 | 8 | 2B | 150 |
結果では、各行には 1 つの visits エントリと 1 つの transactions エントリのデータが含まれています。
FLATTEN と UNIX を組み合わせた例
次の例では、FLATTEN 関数とUNWIND 関数を組み合わせています。
サンプルシナリオでは、 customerInfoコレクションには次のように構造されたドキュメントが含まれています。
{ id: 1, location: "New York", customer: { age: 50, email: "customer@email.com", satisfaction: 5 }, visits: [ { year: 2020, score: 10 }, { year: 2021, score: 8 }, { year: 2022 score: 7 } ] }
クエリ SELECT * FROM customerInfo を実行すると、MongoSQL は次の最上位フィールドを持つドキュメントを返します。
| 1 |
| "New Collection" |
| 5 |
| {経過時間: 50、メール: "customer@email.com"、満足度: 5 } |
| [ { 年: 2020 、スコア: 10 }、{ 年: 2021 、スコア: 8 }、{ 年: 2022 、スコア: 7 } |
クエリ Select * from FLATTEN(UNWIND(customerInfo WITH PATH => visits, INDEX => idx)) を実行すると、MongoSQL は次の最上位フィールドを持つドキュメントを返します。
| 1 | 1 | 1 |
| "New Collection" | "New Collection" | "New Collection" |
| 5 | 5 | 5 |
| 50 | 50 | 50 |
| "customer@email.com" | "customer@email.com" | "customer@email.com" |
| 0 | 1 | 2 |
| 2020 | 2021 | 2022 |
| 10 | 8 | 7 |
FLATTEN関数とUNWIND 関数の両方を使用すると、visits 配列が展開され、結果のドキュメントがフラット化されます。