AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

MongoDB ステートメントを使用したクエリ

このページでは、MongoSQLクエリの例を紹介します。基本的な例ではSQL構文を使用してコレクションをクエリし、より高度な例ではFLATTENとUNWINDを使用してネストされたデータを操作します。

MongoDBはSQL IDEを提供していません。DBeaver、Tableau、Power BIなど、お好みのSQLツールからこれらのクエリを実行してください。SQLツールの接続方法を学ぶには、「SQLツールをMongoDBに接続する」をご覧ください。

独自のデータに対して、以下のMongoSQLクエリを実行してみてください。SQL接続を受け入れるように配置を構成するには、まずSQLインターフェースサーバーの設定を参照してください。

SELECT * FROM sessions;

MongoDB は Sessionsコレクションのすべてのドキュメントを返します。

SELECT * FROM users LIMIT 2;

MongoDB は Usersコレクションから 2 つのドキュメントを返します。

SELECT * FROM users WHERE name = 'Jon Snow';

MongoSQL は、ユーザーの name が Jon Snow であるドキュメントを Usersコレクションから返します。

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_salesFROM RecentSalesWHERE total_sales > 1000;

MongoDB は、1、2025 年 1 月 日以降の合計売上額が 1000 を超える customer_id を持つドキュメントを Salesコレクションから返します。

このセクションでは、ドキュメント構造の操作を容易にする 2 つの MongoDB 機能について説明します。これらは MongoSQL に固有です。

FLATTEN 半構造化データ(JSON 内の名前と値のペア)を別々の列にフラット化します。 フィールド名は、そのフィールドのすべての値を行に保持する列名になります。

ネストされたドキュメントをフラット化するための構文は、FROM 句でデータソースおよびオプションとともに使用できる FLATTEN 関数です。

SELECT *FROM FLATTEN(<data source> WITH DEPTH => <integer>, SEPARATOR => <string>)
変数
必要性
説明

<data source>

必須

データソースをフラット化する

DEPTH

任意

フラット化するサブドキュメントのレベル数を示す正の整数。 デフォルトでは、すべてのレベルのサブドキュメントがフラット化されます。

SEPARATOR

任意

フィールド名を連結するときに区切り文字として使用するstring 。 デフォルトは_です。

サンプルシナリオでは、 customerInfoコレクションには次のように構造されたドキュメントが含まれています。

{ id: 1, location: "New York", customer: { age: 50, email: "customer@email.com", satisfaction: 5 }}

クエリ SELECT * FROM customerInfo を実行すると、MongoSQL は次の最上位フィールドを持つドキュメントを返します。

id

1

location

"New Collection"

customer

{ age: 50, email: "customer@email.com", satisfaction: 5 }

クエリ SELECT * FROM FLATTEN(customerInfo) を実行すると、MongoSQL は次の最上位フィールドを持つドキュメントを返します。

id

1

location

"New Collection"

customer_age

50

customer_email

customer_satisfaction

5

FLATTENを使用すると、元のドキュメントの各フラット化フィールドは結果セットの最上位フィールドになります。 ネストされたフィールドは親フィールド名と連結され、デフォルトの区切り文字_で区切られます。

UNWIND 入力データソースから配列フィールドを分解して、その配列内の各項目に対して 1 行を出力します。展開の詳細については、$unwind 集計ステージのドキュメントを参照してください。

配列フィールドをアンワインドするための構文は、データソースとオプションを指定して FROM 句で使用できる UNWIND 関数です。

SELECT *FROM UNWIND(<data source> WITH PATH | PATHS => <array_paths>, INDEX => <identifier>, OUTER => <bool>)
変数
必要性
説明

<data source>

必須

展開する配列フィールドのソース。

PATH | PATHS

必須

展開するデータソース内のフィールドへのパス。複数のパスを指定するには、括弧を使用します。

INDEX

任意

インデックス列を割り当てる名前。省略した場合、MongoSQL はインデックスフィールドを作成しません。

OUTER

任意

null、欠落、または空の配列値を持つドキュメントが保持されるかどうかを示すフラグ。 trueの場合、null、欠落、または空の配列値を持つドキュメントは保持されます。 デフォルトはfalseです。

サンプルシナリオでは、 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 は次の最上位フィールドを持つドキュメントを返します。

id

1

location

"New Collection"

customer

{ age: 50, email: "customer@email.com", satisfaction: 5 }

visits

[ { 年: 2020 、スコア: 10 }、{ 年: 2021 、スコア: 8 }、{ 年: 2022 、スコア: 7 }

クエリ SELECT * FROM UNWIND(customerInfo WITH PATH => visits, INDEX => idx) を実行すると、MongoSQL は次の最上位フィールドを持つドキュメントを返します。

id

1

1

1

location

"New Collection"

"New Collection"

"New Collection"

customer

{ age: 50, email: "customer@email.com", satisfaction: 5 }

{ age: 50, email: "customer@email.com", satisfaction: 5 }

{ age: 50, email: "customer@email.com", satisfaction: 5 }

idx

0

1

2

visits

{ 年: 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 visits.year AS visit_year, visits.score AS visit_score, purchases.transaction AS transaction_id, purchases.transactions.amount AS purchase_amount, visit_idx, purchase_idx, purchases_transactions_idx AS transaction_idxFROM UNWIND( customerInfo WITH PATHS => ( visits[OUTER => FALSE, INDEX => visit_idx], purchases[INDEX => purchase_idx].transactions[OUTER => FALSE] ), INDEX => idx, OUTER => TRUE)

上記のクエリでは、次の処理が行われます。

  • visits 配列を展開し、展開した配列内のインデックス位置を追跡するためにインデックス名 visit_idx を割り当てます。OUTER => FALSE を設定することで、欠落または空の visits は含まれません。

  • 各 purchasesオブジェクト内で purchases 配列を展開し、transactions 配列を展開します。欠落または空の purchases 配列は OUTER => TRUE を使用して保持されます。また、展開された purchases 配列内のインデックス位置を追跡するにはインデックス名 purchase_idx が割り当てられ、各 purchasesオブジェクト内の展開された transactions 配列内の位置を追跡するには、インデックス名 purchases_transactions_idx が割り当てられます。

  • 各 purchases オブジェクト内の visits オブジェクトから year および score サブフィールドを、purchases オブジェクトから transaction サブフィールドを、transactions オブジェクトから amount サブフィールドを、さらにすべてのインデックスフィールドを選択します。

上記のクエリでは、

  • OUTER => TRUE は、UNWIND データソースの最上位パラメータとして設定されており、パスレベルの OUTER 値が異なる場合を除き、すべての PATHS で使用されるデフォルト値になります。

  • INDEX => idx は、UNWIND データソースの最上位パラメータとして設定されており、パスレベルの INDEX 値が異なる場合を除き、すべての PATHS で使用されるデフォルト値になります。

    例、transactions では特定の INDEX 値が指定されていません。したがって、この最上位値を使用して、完全パスに _idx を追加してインデックス名を作成します。

MongoSQL では、次のフィールドを持つドキュメントが返されます。

visit_year
visit_score
transaction_id
purchase_amount
visit_idx
purchase_idx
transaction_idx

2020

10

1A

100

0

0

0

2020

10

1A

150

0

0

1

2020

10

2B

200

0

1

0

2021

8

1A

100

1

0

0

2021

8

1A

150

1

0

1

2021

8

2B

200

1

1

0

2022

7

1A

100

2

0

0

2022

7

1A

150

2

0

1

2022

7

2B

200

2

1

0

次の例では、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 は次の最上位フィールドを持つドキュメントを返します。

id

1

location

"New Collection"

satisfaction

5

customer

{ age: 50, email: "customer@email.com", satisfaction: 5 }

visits

[ { 年: 2020 、スコア: 10 }、{ 年: 2021 、スコア: 8 }、{ 年: 2022 、スコア: 7 }

クエリ Select * from FLATTEN(UNWIND(customerInfo WITH PATH => visits, INDEX => idx)) を実行すると、MongoSQL は次の最上位フィールドを持つドキュメントを返します。

id

1

1

1

location

"New Collection"

"New Collection"

"New Collection"

satisfaction

5

5

5

customer_age

50

50

50

customer_email

idx

0

1

2

visits_year

2020

2021

2022

visits_score

10

8

7

FLATTEN関数とUNWIND 関数の両方を使用すると、visits 配列が展開され、結果のドキュメントがフラット化されます。