MongoDBでは、 $ substrBytes
集約パイプライン演算子は、指定されたUTF-8エンコードバイトインデックスに基づいて、文字列のサブ文字列を返します。
構文
構文は次のようになります:
{ $substrBytes: [ <string expression>, <byte index>, <byte count> ] }
場所:
<文字列式>
文字列です。文字列に解決される限り、任意の有効な式にすることができます。<バイトインデックス>
サブストリングを開始する場所です。負でない整数または整数として表すことができる数値に解決される限り、任意の有効な式にすることができます。<バイト数>コード> サブストリングが継続するバイト数です。負でない整数または整数として表すことができる数値に解決される限り、任意の有効な式にすることができます。
例
tests
というコレクションがあると想像してください。 次のドキュメントで:
{ "_id" : 1, "data" : "Red Firetruck" }
$ substrBytes
を使用できます このように:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrBytes: [ "$data", 0, 3 ] }
}
}
]
)
結果:
{ "data" : "Red Firetruck", "result" : "Red" }
インデックスはゼロから始まるため、サブストリングはストリングの先頭から始まり、3バイト続きます。
この場合、英語の文字を使用しており、各文字は1バイトです。これにより、使用するバイト数を簡単に数えることができます。
別の例を実行してみましょう:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result_1: { $substrBytes: [ "$data", 4, 4 ] },
result_2: { $substrBytes: [ "$data", 8, 5 ] },
result_3: { $substrBytes: [ "$data", 8, 20 ] }
}
}
]
).pretty()
結果:
{ "data" : "Red Firetruck", "result_1" : "Fire", "result_2" : "truck", "result_3" : "truck" }
3番目の結果では、使用可能なバイト数よりも多くのバイトを指定しましたが、文字列の最後にすべての文字が返されていることに注意してください。
マルチバイト文字
一部の文字は複数のバイトを使用します。 2つ使用するもの、3つ使用するもの、4つ使用するものもあります。
一連の記号を含むドキュメントの例を次に示します。
{ "_id" : 2, "data" : "©♡★✪☆" }
これらの各文字は複数のバイトを使用します。これは、部分文字列を抽出するときに注意する必要があることを意味します。開始点がキャラクターの途中から始まらないようにする必要があります。その場合、エラーが発生します。同様に、エンドポイントがキャラクターの途中で終了しないようにする必要があります。
とりあえず、 $ substrBytes
を適用しましょう エラーを発生させずに:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
bytes: { $strLenBytes: [ "$data" ] },
result: { $substrBytes: [ "$data", 0, 5 ] }
}
}
]
)
結果:
{ "data" : "©♡★✪☆", "bytes" : 14, "result" : "©♡" }
0
の開始点に基づく 5
のバイト長 、結果セットに2つの文字が含まれます。したがって、最初の2文字が5バイトを使用していることがわかります。
この例では、 $ strLenBytes
も使用しました 文字列の合計バイト数を返します。これは主に、5文字が14バイト(1文字あたり複数バイト)を使用することを示すために行いました。
返された2つの文字のそれぞれを返すわずかに変更された例を次に示します。
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
r1: { $substrBytes: [ "$data", 0, 2 ] },
r2: { $substrBytes: [ "$data", 2, 3 ] }
}
}
]
)
結果:
{ "data" : "©♡★✪☆", "r1" : "©", "r2" : "♡" }
最初の文字は2バイトを使用し、2番目の文字は3バイトを使用していることがわかります。
間違った開始点
開始点がキャラクターの途中にある場合、エラーが発生します。
例:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrBytes: [ "$data", 1, 2 ] }
}
}
]
)
結果:
Error: command failed: { "ok" : 0, "errmsg" : "$substrBytes: Invalid range, starting index is a UTF-8 continuation byte.", "code" : 28656, "codeName" : "Location28656" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1
このエラーは、開始インデックスがUTF-8継続バイト
であることを示しています。 。つまり、キャラクターの途中から始めようとしました。
間違ったエンドポイント
エンドポイントも同じです。エンドポイントがキャラクターの途中にある場合、エラーが発生します。
例:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrBytes: [ "$data", 0, 1 ] }
}
}
]
)
結果:
Error: command failed: { "ok" : 0, "errmsg" : "$substrBytes: Invalid range, ending index is in the middle of a UTF-8 character.", "code" : 28657, "codeName" : "Location28657" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1
今回は、終了インデックスがUTF-8文字の途中にある
ことを示しています。 。