$split(集計)
定義
$split
文字列を区切り文字に基づいて部分文字列の配列に分割します。
$split
は、区切り文字を削除し、結果の部分文字列を配列の要素として返します。文字列に区切り文字が見つからない場合、$split
は元の文字列を配列の唯一の要素として返します。$split
には次の演算子式の構文があります。{ $split: [ <string expression>, <delimiter> ] } フィールドタイプ説明string expression
stringdelimiter
string文字列 式を分割するときに使用する区切り記号。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 } ] )
以下の集計操作の目的は、各州の配達量の合計を求め、リストを降順に並べ替えることです。パイプラインには次の 5 つのステージがあります。
$project
ステージでは、qty
(整数)とcity_state
(配列)の 2 つのフィールドを持つドキュメントが生成されます。$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 } ]