$unwind(拆分数组)
最后更新:2026-10-09
$unwind(拆分数组)
$unwind 将文档中的数组字段拆开,为每个数组元素输出一条文档,其余字段原样复制。适合把数组拍平后再做分组、统计或关联。空数组、缺失字段或 null 字段默认被丢弃,可用 preserveNullAndEmptyArrays 保留;includeArrayIndex 可输出元素下标。注意拆分会成倍增加文档数量,需要估算后续阶段的开销。
| 分类 | 核心阶段 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ $unwind: { path: "$数组字段", preserveNullAndEmptyArrays: <布尔>, includeArrayIndex: "<索引字段>" } }
⚙️ 参数
| path | 要拆分的数组字段路径,必须以 $ 开头。 |
|---|---|
| preserveNullAndEmptyArrays | 为 true 时保留空数组、缺失或 null 字段的文档。 |
| includeArrayIndex | 把元素在原数组中的下标输出到指定字段。 |
返回值:拆平后的文档流(每个数组元素一条文档)
▶ 示例
请在本地安装的 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多个数组字段能同时拆吗?
A一个 $unwind 只拆一个数组;要拆多个可连续用多个 $unwind 阶段,结果是笛卡尔积。