$unwind (配列の分解)
最終更新:2026-10-09
$unwind (配列の分解)
$unwind は配列フィールドを分解し、要素ごとに 1 つのドキュメントを出力します(他のフィールドはすべてコピーされます)。グループ化・統計・ルックアップの前に配列を平坦化するのに使います。空・欠落・null の配列を持つドキュメントはデフォルトで除外されます。preserveNullAndEmptyArrays で保持でき、includeArrayIndex で要素のインデックスを公開できます。アンワインドはドキュメント数を増やすため、後続ステージの規模を見積もっておきましょう。
| カテゴリ | コアステージ |
|---|---|
| MongoDB バージョン | 1.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ $unwind: { path: "$arrayField", preserveNullAndEmptyArrays: <bool>, includeArrayIndex: "<indexField>" } }
⚙️ パラメータ
| path | 分解する配列フィールドのパス。$ を付けます。 |
|---|---|
| preserveNullAndEmptyArrays | true の場合、空・欠落・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 }
📌 注意事項
- 空・欠落・null の配列を持つドキュメントは、preserveNullAndEmptyArrays を指定しない限り除外される
- includeArrayIndex で要素の元のインデックスを公開できる
- $unwind を $group や $lookup と組み合わせて要素単位の統計や結合を行う
🏷️ 関連タグ
💡 関連ケース
📚 関連チュートリアル
❓ よくある質問
Q$unwind が生成したドキュメントは同じ _id を持ちますか?
Aはい。_id と他のフィールドはそのままコピーされ、配列フィールドだけが単一要素になります。
Q$unwind が空配列に当たった場合は?
Aデフォルトではそのドキュメントは除外されます。保持するには preserveNullAndEmptyArrays を true にします。
Q複数の配列を一度に分解できますか?
A1 つの $unwind は 1 つの配列を扱います。複数の配列には $unwind ステージを複数つなげます。結果はデカルト積になります。