$split (aggregation)
New in version 3.4.
Definition
$split
- Divides a string into an array of substrings based on a delimiter.
$split
removes the delimiter and returns the resulting substringsas elements of an array. If the delimiter is not found in the string,$split
returns the original string as the only element of an array.
$split
has the following operator expression syntax:
- { $split: [ <string expression>, <delimiter> ] }
FieldTypeDescriptionstring expression
stringThe string to be split. string expression
can be any valid expression aslong as it resolves to a string. For more information onexpressions, see Expressions.delimiter
stringThe delimiter to use when splitting the string expression.delimiter
can be any validexpression as long asit resolves to a string.
Behavior
The $split
operator returns an array.The <string expression>
and <delimiter>
inputs must both bestrings. Otherwise, the operation fails with an error.
Example | Results |
---|---|
|
|
|
|
|
|
|
|
|
|
{ $split: [ "headphone jack", 7 ] } | Errors with message:"$split requires an expression that evaluates to a string asa second argument, found: double" |
{ $split: [ "headphone jack", /jack/ ] } | Errors with message:"$split requires an expression that evaluates to a string asa second argument, found: regex" |
Example
A collection named deliveries
contains the following documents:
- { "_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 totalquantity of deliveries for each state and sort the list indescending order. It has five pipeline stages:
- The
$project
stage produces documents with two fields,qty
(integer) andcity_state
(array). The$split
operator creates an array of strings by splitting thecity
field, using a space (" "
) as a delimiter. - The
$unwind
stage creates a separate record for eachelement in thecity_state
field. - The
$match
stage uses a regular expression to filter outthe city documents, leaving only those containing a state. - The
$group
stage groups all the states together and sums theqty
field. - The
$sort
stage sorts the results bytotal_qty
indescending order.
- 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 }