定義
$substrBytesバージョン 3.4 で追加。
文字列の部分文字列を返します。 部分文字列は次で始まります: 指定された UTF-8 バイト インデックス (ゼロ ベース) の文字 文字列で、指定されたバイト数だけ続行します。
$substrBytesには次の演算子式の構文があります。{ $substrBytes: [ <string expression>, <byte index>, <byte count> ] } フィールドタイプ説明string expressionstring
部分文字列が抽出される string。
string expressionは、string に変換される限り、任意の有効な式にすることができます。 式の詳細については、「式 」を参照してください。引数が の値に解決されるか、欠落しているフィールドを参照する場合、
null$substrBytesは空の string を返します。引数が string または
nullに解決されず、欠落しているフィールドを参照しない場合は、$substrBytesはエラーを返します。byte index数値
部分文字列の開始点を示します。
byte indexは、整数で表せる負でない整数または数値(2.0 など)に変換される限り、任意の有効な式にすることができます。byte indexは、マルチバイトの UTF-8 文字の途中にある開始インデックスを参照できません。byte count数値
は、整数で表せる負でない整数または数値(2.0など)に解決される限り、任意の有効な式を指定できます。
byte countは、UTF-8 文字の途中で終了するインデックスを生成することはできません。
動作
$substrBytes演算子は、UTF- 8でエンコードされたバイトのインデックスを使用します。ここで、各コード ポイントまたは文字は 1 バイトから 4 バイトの間をエンコードするために使用できます。
たとえば、US-ASCII 文字は 1 バイトを使用してエンコードされます。 発音区別符号を持つ文字と追加のラテン文字(アルファベットの外のラテン文字)を持つ文字は、2 バイトを使用してエンコードされます。 中国語、日本語、 韓国語の文字は通常 3 バイト必要であり、Unicode の他のプレーン(文字列、数学記号など)には 4 バイトが必要です。
UTF-8 文字の中間にbyte indexまたはbyte countを配置するとエラーが発生するため、 string expressionの内容に注意することが重要です。
$substrBytesと$substrCP } の違いは、 $substrBytesが各文字のバイト数をカウントするのに対し、 $substrCPは文字が使用するバイト数に関係なく、コード ポイントまたは文字をカウントすることです。
例 | 結果 | ||
|---|---|---|---|
| | ||
| | ||
| | ||
| | ||
| 次のメッセージ付きのエラー。
| ||
| 次のメッセージ付きのエラー。
|
例
1 バイトの文字セット
以下のドキュメントを持つinventoryコレクションを検討してください。
{ "_id" : 1, "item" : "ABC1", quarter: "13Q1", "description" : "product 1" } { "_id" : 2, "item" : "ABC2", quarter: "13Q4", "description" : "product 2" } { "_id" : 3, "item" : "XYZ1", quarter: "14Q2", "description" : null }
次の操作では、 $substrBytes演算子を使用してquarterの値(1 バイトの US-ASCII 文字のみを含む)をyearSubstringとquarterSubstringに分割します。 quarterSubstringフィールドは、 yearSubstringに続く指定されたbyte indexからの string の残りの部分を表します。 これは、 $strLenBytesを使用して string の長さからbyte indexを減算して計算されます。
db.inventory.aggregate( [ { $project: { item: 1, yearSubstring: { $substrBytes: [ "$quarter", 0, 2 ] }, quarterSubtring: { $substrBytes: [ "$quarter", 2, { $subtract: [ { $strLenBytes: "$quarter" }, 2 ] } ] } } } ] )
この操作は次の結果を返します。
{ "_id" : 1, "item" : "ABC1", "yearSubstring" : "13", "quarterSubtring" : "Q1" } { "_id" : 2, "item" : "ABC2", "yearSubstring" : "13", "quarterSubtring" : "Q4" } { "_id" : 3, "item" : "XYZ1", "yearSubstring" : "14", "quarterSubtring" : "Q2" }
シングルバイトおよびマルチバイト文字セット
次のドキュメントを使用して food コレクションを作成します。
db.food.insertMany( [ { "_id" : 1, "name" : "apple" }, { "_id" : 2, "name" : "banana" }, { "_id" : 3, "name" : "éclair" }, { "_id" : 4, "name" : "hamburger" }, { "_id" : 5, "name" : "jalapeño" }, { "_id" : 6, "name" : "pizza" }, { "_id" : 7, "name" : "tacos" }, { "_id" : 8, "name" : "寿司sushi" } ] )
次の操作では、 $substrBytes演算子を使用して、 nameの値から 3 バイトのmenuCodeを作成します。
db.food.aggregate( [ { $project: { "name": 1, "menuCode": { $substrBytes: [ "$name", 0, 3 ] } } } ] )
この操作は次の結果を返します。
{ "_id" : 1, "name" : "apple", "menuCode" : "app" } { "_id" : 2, "name" : "banana", "menuCode" : "ban" } { "_id" : 3, "name" : "éclair", "menuCode" : "éc" } { "_id" : 4, "name" : "hamburger", "menuCode" : "ham" } { "_id" : 5, "name" : "jalapeño", "menuCode" : "jal" } { "_id" : 6, "name" : "pizza", "menuCode" : "piz" } { "_id" : 7, "name" : "tacos", "menuCode" : "tac" } { "_id" : 8, "name" : "寿司sushi", "menuCode" : "寿" }