sql >> データベース >  >> NoSQL >> MongoDB

MongoDB $ indexOfCP

    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


    1. SQLでグループの最大値を持つ行を選択する5つの方法

    2. リクエストごとにMongoDBを複数回クエリしても大丈夫ですか?

    3. XAMPPウィンドウにPredisをインストールするにはどうすればよいですか?

    4. サブドキュメントをMongoDBのルートレベルにフラット化するにはどうすればよいですか?