MongoDB $unwind详解

在 MongoDB 中,$unwind是用来展开数组字段的操作符,它将包含数组的一行数据拆分成多行,每行包含数组中的一个元素。$unwind 主要用于处理包含数组的文档,将数组中的元素展开成多个文档,方便进行后续的查询和分析操作。
$unwind的基本语法
$unwind 操作符的基本语法如下:
{ $unwind: { path: <field path>, includeArrayIndex: <string>, preserveNullAndEmptyArrays: <boolean> } }
path:需要展开的数组字段路径,通常是一个字符串,例如"$books"。includeArrayIndex:可选参数,表示将数组下标添加到展开后的文档字段中。preserveNullAndEmptyArrays:可选参数,表示是否保留空数组或不存在的数组字段,默认为 false。
示例数据
假设有如下文档:
{
"_id": 1,
"city": "New York",
"books": ["book1", "book2", "book3"]
}
使用$unwind展开数组字段
下面通过一个示例来演示如何使用 $unwind 展开数组字段:
db.cities.insertOne({
"_id": 1,
"city": "New York",
"books": ["book1", "book2", "book3"]
})
db.cities.aggregate([
{ unwind: "books" }
])
运行上述代码后,得到的结果如下:
{ "_id": 1, "city": "New York", "books": "book1" }
{ "_id": 1, "city": "New York", "books": "book2" }
{ "_id": 1, "city": "New York", "books": "book3" }
可以看到,原始的文档被展开成了包含每本书的单独文档,方便后续的查询操作。
使用$unwind展开数组字段并保留空数组
有时候,数组字段可能为空,或者文档中并不包含某个数组字段,此时可以使用 preserveNullAndEmptyArrays 参数来保留空数组。
db.cities.aggregate([
{ unwind: { path: "books", preserveNullAndEmptyArrays: true } }
])
当数组字段为空时,$unwind 将会保留原始文档,并将数组字段展开成一个空文档。
使用$unwind展开数组字段并添加数组下标
有时候,我们需要将数组的下标信息也包含在展开后的文档中,这时可以使用 includeArrayIndex 参数。
db.cities.aggregate([
{ unwind: { path: "books", includeArrayIndex: "index" } }
])
运行上述代码后,得到的结果如下:
{ "_id": 1, "city": "New York", "books": "book1", "index": 0 }
{ "_id": 1, "city": "New York", "books": "book2", "index": 1 }
{ "_id": 1, "city": "New York", "books": "book3", "index": 2 }
可以看到,每个展开后的文档中都包含了数组元素的下标信息。
总结
通过本文的介绍,我们详细讲解了 MongoDB 中 $unwind 操作符的用法和示例,$unwind 可以很方便地展开包含数组的文档,将数组中的元素拆分成单独的文档,从而方便进行后续的查询和分析操作。在实际使用中,根据具体需求选择合适的参数来展开数组字段,可以更高效地处理数据。
极客教程