MongoDBでは、$indexOfCP
集約パイプライン演算子は、文字列で部分文字列の出現を検索し、最初に出現したUTFコードポイントインデックスを返します。
UTFコードポイントインデックスはゼロベースです(つまり、0
で始まります 。
構文
構文は次のようになります:
{ $indexOfCP: [ <string expression>, <substring expression>, <start>, <end> ] }
場所:
<string expression>
検索する文字列です。<substring expression>
文字列内で検索するサブ文字列です。-
<start>
検索の開始インデックス位置を指定するオプションの引数です。非負の整数に解決される任意の有効な式にすることができます。 -
<end>
検索の終了インデックス位置を指定するオプションの引数です。非負の整数に解決される任意の有効な式にすることができます。
指定された値が見つからない場合は、$indexOfCP
-1
を返します 。
指定された値のインスタンスが複数ある場合は、最初のインスタンスのみが返されます。
例
test
というコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "data" : "c 2021" } { "_id" : 2, "data" : "© 2021" } { "_id" : 3, "data" : "ไม้เมือง" }
$indexOfCP
を適用する例を次に示します。 それらのドキュメントへ:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfCP: [ "$data", "2021" ] }
}
}
]
)
結果:
{ "data" : "c 2021", "result" : 2 } { "data" : "© 2021", "result" : 2 } { "data" : "ไม้เมือง", "result" : -1 }
最初の2つのドキュメントでは、サブストリングはUTFコードポイントのインデックス位置2
で見つかりました。 。与えられた$indexOfCP
結果はゼロベースです(インデックスは0
から始まります )位置2は、3番目のコードポイントを表します。
これは、$indexOfBytes
を使用した場合に得られる結果とは異なります。 、著作権記号(©
)2番目のドキュメントでは2バイトを使用します。ただし、使用するコードポイントは1つだけです。これは、文字c
と同じです。 使用します。
3番目のドキュメントについては、部分文字列がまったく見つからなかったため、結果は-1
になります。 。
別の例を次に示します。ただし、今回はタイ語の文字を検索します。
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfCP: [ "$data", "เ" ] }
}
}
]
)
結果:
{ "data" : "c 2021", "result" : -1 } { "data" : "© 2021", "result" : -1 } { "data" : "ไม้เมือง", "result" : 3 }
この場合、3番目のドキュメントにある文字を検索すると、そのUTF-8コードポイントインデックスは3
として返されます。 。与えられた$indexOfCP
結果はゼロベースです。これは、4番目のコードポイントであることを意味します。
これは、2番目の文字に発音区別符号があり、これがコードポイントでもあるためです。したがって、最初の文字は1つのコードポイントであり、2番目の文字は2つのコードポイント(発音区別符号を含む)であり、3に相当します。これは、キャラクターが4番目の位置(コードポイント番号3
)から始まることを意味します。 、0
から始まるインデックスカウントのため 。
MongoDB $strLenCP
を参照してください この特定の文字列の各文字のコードポイントの数を返す例の場合。そして、MongoDB $strLenBytes
を参照してください 同じ文字列のバイト数を確認します。
開始位置を指定
3番目の引数を指定して、検索の開始インデックス位置を指定できます。
次のドキュメントがあるとします。
{ "_id" : 4, "data" : "ABC XYZ ABC" }
$indexOfCP
を適用する例を次に示します。 開始位置:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfCP: [ "$data", "ABC", 1 ] }
}
}
]
)
結果:
{ "data" : "ABC XYZ ABC", "result" : 8 }
この場合、部分文字列の2番目のインスタンスが返されました。これは、1
の位置から検索を開始したためです。 、および部分文字列の最初のインスタンスは、位置0
から始まります。 (検索の開始位置の前)
開始位置が文字列より大きいか終了位置より大きい数値の場合、$indexOfCP
-1
を返します 。
負の数の場合は、$indexOfCP
エラーを返します。
終了位置を指定
4番目の引数を指定して、検索の終了インデックス位置を指定することもできます。
この引数を指定する場合は、開始位置も指定する必要があります。そうしないと、この議論が出発点として解釈されることになります。
例:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfCP: [ "$data", "XYZ", 0, 3 ] }
}
}
]
)
結果:
{ "data" : "ABC XYZ ABC", "result" : -1 }
結果は-1
です これは、部分文字列が見つからなかったことを意味します。これは、0
の位置から検索を開始したためです。 3
の位置で終了しました 、したがって、部分文字列をキャプチャしません。
インデックスの終了位置をインクリメントすると、次のようになります。
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfCP: [ "$data", "XYZ", 0, 5 ] }
}
}
]
)
結果:
{ "data" : "ABC XYZ ABC", "result" : 4 }
今回は値が含まれ、そのインデックス位置が返されました。
終了位置が開始位置よりも小さい数値の場合、$indexOfCP
-1
を返します 。
負の数の場合は、$indexOfCP
エラーを返します。
欠落しているフィールド
フィールドがドキュメントにない場合は、$indexOfCP
null
を返します 。
次のドキュメントがあるとします。
{ "_id" : 5 }
$indexOfCP
を適用すると次のようになります :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfCP: [ "$data", "XYZ" ] }
}
}
]
)
結果:
{ "result" : null }
ヌル値
最初の引数がnull
の場合 、$indexOfCP
null
を返します 。
次のドキュメントがあるとします。
{ "_id" : 6, "data" : null }
$indexOfCP
を適用すると次のようになります :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfCP: [ "$data", "XYZ" ] }
}
}
]
)
結果:
{ "data" : null, "result" : null }
ただし、2番目の引数(つまり、部分文字列)がnull
の場合 、エラーが返されます:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfCP: [ "$data", null ] }
}
}
]
)
結果:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$indexOfCP requires a string as the second argument, found: null", "code" : 40094, "codeName" : "Location40094" } : 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
間違ったデータ型
最初の引数が間違ったデータ型である場合(つまり、文字列に解決されない場合)、$indexOfCP
エラーを返します。
次のドキュメントがあるとします。
{ "_id" : 7, "data" : 123 }
$indexOfCP
を適用すると次のようになります そのドキュメントへ:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfCP: [ "$data", "XYZ" ] }
}
}
]
)
結果:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$indexOfCP requires a string as the first argument, found: double", "code" : 40093, "codeName" : "Location40093" } : 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
エラーメッセージに示されているように、$indexOfCP requires a string as the first argument
。