Docs Menu
Docs Home
/
MongoDB マニュアル
/ / /

$substrBytes(集計)

項目一覧

  • 定義
  • 動作
$substrBytes

文字列の部分文字列を返します。 部分文字列は次で始まります: 指定された UTF-8 バイト インデックス (ゼロ ベース) の文字 文字列で、指定されたバイト数だけ続行します。

$substrBytesには次の演算子式の構文があります。

{ $substrBytes: [ <string expression>, <byte index>, <byte count> ] }
フィールド
タイプ
説明
string expression
string

部分文字列が抽出される 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は文字が使用するバイト数に関係なく、コード ポイントまたは文字をカウントすることです。

結果
{ $substrBytes: [ "abcde", 1, 2 ] }
"bc"
{ $substrBytes: [ "Hello World!", 6, 5 ] }
"World"
{ $substrBytes: [ "cafétéria", 0, 5 ] }
"café"
{ $substrBytes: [ "cafétéria", 5, 4 ] }
"tér"
{ $substrBytes: [ "cafétéria", 7, 3 ] }

次のメッセージ付きのエラー。

"Error: Invalid range, starting index is a UTF-8 continuation byte."

{ $substrBytes: [ "cafétéria", 3, 1 ] }

次のメッセージ付きのエラー。

"Error: Invalid range, ending index is in the middle of a UTF-8 character."

以下のドキュメントを持つ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 文字のみを含む)をyearSubstringquarterSubstringに分割します。 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" : "寿" }

Tip

以下も参照してください。

戻る

$substr

項目一覧