MongoDBでは、$substrCP
集計パイプライン演算子は、指定されたUTF-8コードポイントインデックスに基づいて、文字列のサブ文字列を返します。
構文
構文は次のようになります:
{ $substrCP: [ <string expression>, <code point index>, <code point count> ] }
場所:
<string expression>
文字列です。文字列に解決される限り、任意の有効な式にすることができます。<code point index>
サブストリングを開始する場所です。負でない整数に解決される限り、任意の有効な式にすることができます。<code point count>
サブストリングが継続する必要があるコードポイントの数です。負でない整数または整数として表すことができる数値に解決される限り、任意の有効な式にすることができます。
例
tests
というコレクションがあると想像してください。 次のドキュメントで:
{ "_id" : 1, "data" : "Red Firetruck" }
$substrCP
を使用できます このように:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 0, 3 ] }
}
}
]
)
結果:
{ "data" : "Red Firetruck", "result" : "Red" }
インデックスはゼロから始まるため、サブストリングはストリングの先頭から始まり、3つのコードポイントまで続きました。
この場合、英語の文字を使用しており、各文字には1つのコードポイントがあります。これにより、使用するコードポイントの数を簡単に数えることができます。
別の例を実行してみましょう:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result_1: { $substrCP: [ "$data", 4, 4 ] },
result_2: { $substrCP: [ "$data", 8, 5 ] },
result_3: { $substrCP: [ "$data", 8, 20 ] }
}
}
]
).pretty()
結果:
{ "data" : "Red Firetruck", "result_1" : "Fire", "result_2" : "truck", "result_3" : "truck" }
3番目の結果では、使用可能なコードポイントよりも多くのコードポイントを指定しましたが、すべての文字を文字列の最後に返すだけでした。
発音区別符号
一部の文字には発音区別符号が追加されているため、複数のコードポイントが生成されます。
thai
というコレクションがあるとします。 次のドキュメントが含まれています:
{ "_id" : 1, "data" : "ไม้เมือง" } { "_id" : 2, "data" : "ไ" } { "_id" : 3, "data" : "ม้" } { "_id" : 4, "data" : "เ" } { "_id" : 5, "data" : "มื" } { "_id" : 6, "data" : "อ" } { "_id" : 7, "data" : "ง" }
これらのドキュメントにはタイ文字が含まれています。これらの文字の2つに発音区別符号(最初のグリフの上にある小さなグリフ)が含まれていることがわかります。
ドキュメント2から7は、ドキュメント1に含まれる各文字をリストするだけです。
サブストリングを取得する前に、$strLenCP
を使用して、これらの各文字が持つコードポイントの数を調べましょう。 演算子:
db.thai.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$data" }
}
}
]
)
結果:
{ "data" : "ไม้เมือง", "result" : 8 } { "data" : "ไ", "result" : 1 } { "data" : "ม้", "result" : 2 } { "data" : "เ", "result" : 1 } { "data" : "มื", "result" : 2 } { "data" : "อ", "result" : 1 } { "data" : "ง", "result" : 1 }
発音区別符号のある2つの文字には2つのコードポイントがあり、他の文字には1つのコードポイントがあることがわかります。
$substrCP
を適用しましょう 最初のドキュメントへ:
db.thai.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
結果:
{ "data" : "ไม้เมือง", "result" : "ม้" }
1
の開始点に基づく 2
のコードポイント数 、2番目の文字とそれに関連する発音区別符号を取得します。
グリフを分離する
前の例では、3番目の引数は2であったため、文字と発音区別符号が一緒に返されました。 1の3番目の引数を指定するとどうなりますか。
db.thai.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 1 ] }
}
}
]
)
結果:
{ "data" : "ไม้เมือง", "result" : "ม" }
最初の文字は発音区別符号なしで返されます。
その他のデータ型
$substrCP
演算子は文字列に対してのみ機能します。ただし、別のデータ型がある場合でも、文字列に解決できる限り、機能するはずです。
次のドキュメントがあるとします。
{ "_id" : 2, "data" : 123456 }
data
フィールドには数字が含まれています。
$substrCP
を適用すると次のようになります その分野へ:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
結果:
{ "data" : 123456, "result" : "23" }
それはうまく仕事をすることができました(結果は数字ではなく文字列であることに注意してください)。
Dateオブジェクトを含む別のドキュメントがあります:
{ "_id" : 3, "data" : ISODate("2021-01-03T23:30:15.100Z") }
それでは、$substrCP
を適用しましょう そのドキュメントへ:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 0, 4 ] }
}
}
]
)
結果:
{ "data" : ISODate("2021-01-03T23:30:15.100Z"), "result" : "2021" }
したがって、このシナリオでも問題なく機能しました。
ヌル値
文字列がnull
の場合 、結果は空の文字列になります。
次のドキュメントがあるとします。
{ "_id" : 4, "data" : null }
$substrCP
を適用すると次のようになります そのドキュメントへ:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
結果:
{ "data" : null, "result" : "" }
ミッシングフィールド
存在しないフィールドからサブストリングを取得しようとすると、空のストリングになります。
次のドキュメントがあるとします。
{ "_id" : 5 }
$substrCP
を適用します :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
結果:
{ "result" : "" }