$unwind (配列の分解)

最終更新:2026-10-09

$unwind (配列の分解)

$unwind は配列フィールドを分解し、要素ごとに 1 つのドキュメントを出力します(他のフィールドはすべてコピーされます)。グループ化・統計・ルックアップの前に配列を平坦化するのに使います。空・欠落・null の配列を持つドキュメントはデフォルトで除外されます。preserveNullAndEmptyArrays で保持でき、includeArrayIndex で要素のインデックスを公開できます。アンワインドはドキュメント数を増やすため、後続ステージの規模を見積もっておきましょう。

カテゴリコアステージ
MongoDB バージョン1.0+
例の言語mongosh(シェル)

📝 構文

{ $unwind: { path: "$arrayField", preserveNullAndEmptyArrays: <bool>, includeArrayIndex: "<indexField>" } }

⚙️ パラメータ

path分解する配列フィールドのパス。$ を付けます。
preserveNullAndEmptyArraystrue の場合、空・欠落・null の配列を持つドキュメントを保持します。
includeArrayIndex元の配列における各要素のインデックスをこのフィールドに出力します。

戻り値:平坦化されたドキュメントストリーム(配列要素ごとに1ドキュメント)

▶ 例

以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):

// $unwind: tags 配列を分解
db.inventory.aggregate([
  { $unwind: { path: '$tags', includeArrayIndex: 'idx' } }
])

出力:

{ "_id": 1, "item": "Pen", "tags": "A", "idx": 0 }
{ "_id": 1, "item": "Pen", "tags": "B", "idx": 1 }

📌 注意事項

📚 関連チュートリアル

❓ よくある質問

Q$unwind が生成したドキュメントは同じ _id を持ちますか?
Aはい。_id と他のフィールドはそのままコピーされ、配列フィールドだけが単一要素になります。
Q$unwind が空配列に当たった場合は?
Aデフォルトではそのドキュメントは除外されます。保持するには preserveNullAndEmptyArrays を true にします。
Q複数の配列を一度に分解できますか?
A1 つの $unwind は 1 つの配列を扱います。複数の配列には $unwind ステージを複数つなげます。結果はデカルト積になります。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%