$split(聚合)
定义
$split
根据分隔符将字符串划分为子字符串数组。
$split
会删除该分隔符,并将生成的子字符串作为数组的元素返回。如果在此字符串中未找到分隔符,$split
则会返回原始字符串以作为数组的唯一元素。$split
具有以下操作符表达式语法:{ $split: [ <string expression>, <delimiter> ] }
行为
$split
操作符返回一个数组。<string expression>
和 <delimiter>
输入必须均为字符串。否则,此操作会失败并出现错误。
例子 | 结果 | ||
---|---|---|---|
|
| ||
|
| ||
|
| ||
|
| ||
|
| ||
{ $split: [ "headphone jack", 7 ] } | 错误消息:
| ||
{ $split: [ "headphone jack", /jack/ ] } | 错误消息:
|
例子
一个名为 deliveries
的集合包含以下文档:
db.deliveries.insertMany( [ { _id: 1, city: "Berkeley, CA", qty: 648 }, { _id: 2, city: "Bend, OR", qty: 491 }, { _id: 3, city: "Kensington, CA", qty: 233 }, { _id: 4, city: "Eugene, OR", qty: 842 }, { _id: 5, city: "Reno, NV", qty: 655 }, { _id: 6, city: "Portland, OR", qty: 408 }, { _id: 7, city: "Sacramento, CA", qty: 574 } ] )
以下聚合操作的目标是查找每个州的交付(deliveries)总数量,并按降序对列表进行排序。它包含五个管道阶段:
$project
阶段生成包含两个字段的文档,即qty
(整数)和city_state
(数组)。$split
运算符通过拆分city
字段,使用逗号后跟空格 (", "
) 作为分隔符来创建字符串数组。$unwind
阶段为city_state
字段中的每个元素创建一个单独的记录。$match
阶段会使用正则表达式过滤掉城市文档,只剩下包含省/市/自治区的文档。$group
阶段会将所有状态分在一组,并对qty
字段求和。$sort
阶段按total_qty
降序对结果排序。
db.deliveries.aggregate( [ { $project: { city_state: { $split: ["$city", ", "] }, qty: 1 } }, { $unwind: "$city_state" }, { $match: { city_state: /[A-Z]{2}/ } }, { $group: { _id: { state: "$city_state" }, total_qty: { $sum: "$qty" } } }, { $sort: { total_qty: -1 } } ] )
操作返回以下结果:
[ { _id: { state: "OR" }, total_qty: 1741 }, { _id: { state: "CA" }, total_qty: 1455 }, { _id: { state: "NV" }, total_qty: 655 } ]