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

MongoDB $ strLenCP

    MongoDB、$strLenCP 集計パイプライン演算子は、指定された文字列内のUTF-8コードポイントの数を返します。

    $strLenCP 演算子は$strLenBytesとは異なります 文字列のバイト数を返す演算子。

    englishというコレクションがあるとします。 次のドキュメントを使用:

    { "_id" : 1, "data" : "Maimuang" }
    { "_id" : 2, "data" : "M" }
    { "_id" : 3, "data" : "a" }
    { "_id" : 4, "data" : "i" }
    { "_id" : 5, "data" : "m" }
    { "_id" : 6, "data" : "u" }
    { "_id" : 7, "data" : "a" }
    { "_id" : 8, "data" : "n" }
    { "_id" : 9, "data" : "g" }

    $strLenCPを適用できます それらのドキュメントのデータフィールドへ:

    db.english.aggregate(
       [
         {
           $project:
              {
                _id: 0,
                data: 1,
                result: { $strLenCP: "$data" }
              }
         }
       ]
    )

    結果:

    { "data" : "Maimuang", "result" : 8 }
    { "data" : "M", "result" : 1 }
    { "data" : "a", "result" : 1 }
    { "data" : "i", "result" : 1 }
    { "data" : "m", "result" : 1 }
    { "data" : "u", "result" : 1 }
    { "data" : "a", "result" : 1 }
    { "data" : "n", "result" : 1 }
    { "data" : "g", "result" : 1 }

    単語全体で8つのコードポイントが使用され、各文字で1つのコードポイントが使用されていることがわかります。

    タイ文字

    これは、それぞれ3バイトのタイ文字を使用しているが、1つのコードポイントのみを使用している例です。

    thaiというコレクションがあります 次のドキュメントを使用:

    { "_id" : 1, "data" : "ไม้เมือง" }
    { "_id" : 2, "data" : "ไ" }
    { "_id" : 3, "data" : "ม้" }
    { "_id" : 4, "data" : "เ" }
    { "_id" : 5, "data" : "มื" }
    { "_id" : 6, "data" : "อ" }
    { "_id" : 7, "data" : "ง" }

    $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つのコードポイントが返されます。 $strLenBytesを使用すると、これらの文字は6バイトを返します。 オペレーター。

    その他のキャラクター

    otherというコレクションがあるとします。 次のドキュメントを使用:

    { "_id" : 1, "data" : "é" }
    { "_id" : 2, "data" : "©" }
    { "_id" : 3, "data" : "℘" }

    そして、$strLenCPを適用しましょう それらのドキュメントへ:

    db.other.aggregate(
       [
         { $match: { _id: { $in: [ 1, 2, 3 ] } } },
         {
           $project:
              {
                _id: 0,
                data: 1,
                result: { $strLenCP: "$data" }
              }
         }
       ]
    )

    結果:

    { "data" : "é", "result" : 1 }
    { "data" : "©", "result" : 1 }
    { "data" : "℘", "result" : 1 }

    これらの各文字は単一のコードポイントを使用します(そのような文字は複数のバイトを使用しますが)。

    スペース文字はコードポイントを使用します。したがって、2つのスペース文字は2つのコードポイントを使用します。

    次のドキュメントがあるとします。

    { "_id" : 4, "data" : " " }
    { "_id" : 5, "data" : "  " }

    そして、$strLenCPを適用します それらのドキュメントへ:

    db.other.aggregate(
       [
         { $match: { _id: { $in: [ 4, 5 ] } } },
         {
           $project:
              {
                _id: 0,
                data: 1,
                result: { $strLenCP: "$data" }
              }
         }
       ]
    )

    結果:

    { "data" : " ", "result" : 1 }
    { "data" : "  ", "result" : 2 }

    空の文字列

    空の文字列は0を返します 。

    空の文字列を含むドキュメントは次のとおりです:

    { "_id" : 6, "data" : "" }

    $strLenCPを適用すると次のようになります そのドキュメントへ:

    db.other.aggregate(
       [
         { $match: { _id: { $in: [ 6 ] } } },
         {
           $project:
              {
                _id: 0,
                data: 1,
                result: { $strLenCP: "$data" }
              }
         }
       ]
    )

    結果:

    { "data" : "", "result" : 0 }

    間違ったデータ型

    間違ったデータ型を渡すと、エラーが発生します。

    次のドキュメントがあるとします。

    { "_id" : 7, "data" : 123 }

    データのfield 数字が含まれています。

    $strLenCPを適用しましょう そのドキュメントへ:

    db.other.aggregate(
       [
         { $match: { _id: { $in: [ 7 ] } } },
         {
           $project:
              {
                _id: 0,
                data: 1,
                result: { $strLenCP: "$data" }
              }
         }
       ]
    )

    結果:

    uncaught exception: Error: command failed: {
    	"ok" : 0,
    	"errmsg" : "$strLenCP requires a string argument, found: double",
    	"code" : 34471,
    	"codeName" : "Location34471"
    } : 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

    ヌル値

    nullを提供する また、エラーが発生します。

    次のドキュメントがあるとします。

    { "_id" : 8, "data" : null }

    データのfield nullが含まれています 。

    $strLenCPを適用しましょう そのドキュメントへ:

    db.other.aggregate(
       [
         { $match: { _id: { $in: [ 8 ] } } },
         {
           $project:
              {
                _id: 0,
                data: 1,
                result: { $strLenCP: "$data" }
              }
         }
       ]
    )

    結果:

    Error: command failed: {
    	"ok" : 0,
    	"errmsg" : "$strLenCP requires a string argument, found: null",
    	"code" : 34471,
    	"codeName" : "Location34471"
    } : 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

    欠落しているフィールド

    エラーの発生というテーマを継続し、存在しないフィールドを指定するとエラーも発生します。

    ドキュメント:

    { "_id" : 9 }

    $strLenCPを適用します :

    db.other.aggregate(
       [
         { $match: { _id: { $in: [ 9 ] } } },
         {
           $project:
              {
                _id: 0,
                data: 1,
                result: { $strLenCP: "$data" }
              }
         }
       ]
    )

    結果:

    Error: command failed: {
    	"ok" : 0,
    	"errmsg" : "$strLenCP requires a string argument, found: missing",
    	"code" : 34471,
    	"codeName" : "Location34471"
    } : 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

    1. TrelloはMongoDBにデータをどのように保存しますか? (ボードごとのコレクション?)

    2. 新しい_idを使用してMongoDBでドキュメントを複製します

    3. MongoDBドキュメントの配列要素の一致基準を更新するにはどうすればよいですか?

    4. Rails + MongoMapper+EmbeddedDocumentフォームヘルプ