$split (aggregation)
On this page本页内容
Definition定义
$split-
Divides a string into an array of substrings based on a delimiter.根据分隔符将字符串划分为子字符串数组。$splitremoves the delimiter and returns the resulting substrings as elements of an array.$split删除分隔符,并将生成的子字符串作为数组的元素返回。If the delimiter is not found in the string,如果在字符串中找不到分隔符,$splitreturns the original string as the only element of an array.$split将原始字符串作为数组的唯一元素返回。$splithas the following operator expression syntax:具有以下运算符表达式语法:{ $split: [ <string expression>, <delimiter> ] }Field字段Type类型Description描述string expressionstring The string to be split.要拆分的字符串。string expressioncan be any valid expression as long as it resolves to a string.可以是任何有效的表达式,只要它解析为字符串即可。For more information on expressions, see Expressions.有关表达式的详细信息,请参阅表达式。delimiterstring The delimiter to use when splitting the string expression.拆分字符串表达式时要使用的分隔符。delimitercan be any valid expression as long as it resolves to a string.可以是任何有效的表达式,只要它解析为字符串即可。
Behavior行为
The $split operator returns an array. $split运算符返回一个数组。The <string expression> and <delimiter> inputs must both be strings. <string expression>和<delimiter>输入必须都是字符串。Otherwise, the operation fails with an error.否则,操作将失败并出现错误。
{ $split: [ "June-15-2013", "-" ] }
|
[ "June", "15", "2013" ] |
{ $split: [ "banana split", "a" ] }
|
[ "b", "n", "n", " split" ] |
{ $split: [ "Hello World", " " ] }
|
[ "Hello", "World" ] |
{ $split: [ "astronomical", "astro" ] }
|
[ "", "nomical" ] |
{ $split: [ "pea green boat", "owl" ] }
|
[ "pea green boat" ]
|
{ $split: [ "headphone jack", 7 ] } | "$split requires an expression that evaluates to a string as a second argument, found: double" |
{ $split: [ "headphone jack", /jack/ ] } | "$split requires an expression that evaluates to a string as a second argument, found: regex" |
Example实例
A collection named 名为deliveries contains the following documents:deliveries的集合包含以下文档:
{ "_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 }
The goal of following aggregation operation is to find the total quantity of deliveries for each state and sort the list in descending order. It has five pipeline stages:以下聚合操作的目标是找到每个状态的交付总量,并按降序对列表进行排序。它有五个管道阶段:
The$projectstage produces documents with two fields,qty(integer) andcity_state(array).$project阶段生成具有两个字段的文档,即qty(integer)和city_state(array)。The$splitoperator creates an array of strings by splitting thecityfield, using a comma followed by a space (", ") as a delimiter.$split运算符通过拆分city字段创建字符串数组,使用逗号后跟空格(", ")作为分隔符。The$unwindstage creates a separate record for each element in thecity_statefield.$unwind阶段为city_state字段中的每个元素创建一个单独的记录。The$matchstage uses a regular expression to filter out the city documents, leaving only those containing a state.$match阶段使用正则表达式筛选掉city文档,只留下那些包含state的文档。The$groupstage groups all the states together and sums theqtyfield.$group阶段将所有状态分组在一起,并对qty字段求和。The$sortstage sorts the results bytotal_qtyin descending order.$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 } }
]);
The operation returns the following results:该操作返回以下结果:
{ "_id" : { "state" : "OR" }, "total_qty" : 1741 }
{ "_id" : { "state" : "CA" }, "total_qty" : 1455 }
{ "_id" : { "state" : "NV" }, "total_qty" : 655 }