$split (aggregation)
On this page
Definition
$split
Divides a string into an array of substrings based on a delimiter.
$split
removes the delimiter and returns the resulting substrings as 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 as long as it resolves to a string. For more information on expressions, see Expression Operators.delimiter
stringThe delimiter to use when splitting the string expression.delimiter
can be any valid expression as long as it resolves to a string.
Behavior
The $split
operator returns an array.
The <string expression>
and <delimiter>
inputs must both be
strings. Otherwise, the operation fails with an error.
Example | Results | ||
---|---|---|---|
|
| ||
|
| ||
|
| ||
|
| ||
|
| ||
{ $split: [ "headphone jack", 7 ] } | Errors with message:
| ||
{ $split: [ "headphone jack", /jack/ ] } | Errors with message:
|
Example
A collection named deliveries
contains the following documents:
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 } ] )
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
$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 comma followed by a space (", "
) as a delimiter.The
$unwind
stage creates a separate record for each element in thecity_state
field.The
$match
stage uses a regular expression to filter out the 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
in descending 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 } ]