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

MongoDBの$strLenBytesと$strLenCP:違いは何ですか?

    MongoDBには、$strLenBytesが含まれています および$strLenCP 集約パイプラインフレームワークの演算子。これらの演算子は似ていますが、わずかに異なることを行います。両方がまったく同じ結果を返す場合もあれば、結果が異なる場合もあります。

    これら2つの演算子の違いの概要は次のとおりです。

    違い

    各演算子の定義は次のとおりです。

    • $strLenBytes UTF-8でエンコードされたバイト数を返します 指定された文字列内
    • $strLenCP UTF-8コードポイントの数を返します 指定された文字列で。

    太字の違いに注意してください。 1つは数値バイトを返します 、もう1つはコードポイントの数を返します 。

    英語の文字列を操作する場合、バイト数は通常、コードポイントの数と同じになります。各コードポイントは1バイトを使用します。

    ただし、別のUnicodeブロックを使用する他の言語を使用する場合、バイト数が2バイトまたは3バイトに増えることがあります。これは、記号や絵文字などの他のUnicodeコードポイントを操作する場合にも当てはまります。場合によっては、1文字で4バイトが使用されることがあります。

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

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

    それでは、両方の$strLenBytesを適用しましょう。 および$strLenCP データフィールドへ:

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

    結果:

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

    すべての文字が1つのコードポイントのみを使用していることがわかりますが、最初のドキュメントは2バイトを使用し、他の2つのドキュメントはそれぞれ3バイトを使用しています。

    英語の文字

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

    { "_id" : 1, "data" : "Fast dog" }
    { "_id" : 2, "data" : "F" }
    { "_id" : 3, "data" : "a" }
    { "_id" : 4, "data" : "s" }
    { "_id" : 5, "data" : "t" }
    { "_id" : 6, "data" : " " }
    { "_id" : 7, "data" : "d" }
    { "_id" : 8, "data" : "o" }
    { "_id" : 9, "data" : "g" }

    それでは、両方の$strLenBytesを適用しましょう。 および$strLenCP データフィールドへ:

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

    結果:

    { "data" : "Fast dog", "strLenCP" : 8, "strLenBytes" : 8 }
    { "data" : "F", "strLenCP" : 1, "strLenBytes" : 1 }
    { "data" : "a", "strLenCP" : 1, "strLenBytes" : 1 }
    { "data" : "s", "strLenCP" : 1, "strLenBytes" : 1 }
    { "data" : "t", "strLenCP" : 1, "strLenBytes" : 1 }
    { "data" : " ", "strLenCP" : 1, "strLenBytes" : 1 }
    { "data" : "d", "strLenCP" : 1, "strLenBytes" : 1 }
    { "data" : "o", "strLenCP" : 1, "strLenBytes" : 1 }
    { "data" : "g", "strLenCP" : 1, "strLenBytes" : 1 }

    この場合、すべての文字はそれぞれ1つのコードポイントと1バイトを使用します。

    タイ文字

    これは、タイ文字を使用して、すべての言語がコードポイントごとに1バイトを使用するわけではないことを示す例です。

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

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

    $strLenBytesの両方を適用すると次のようになります および$strLenCP データフィールドへ:

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

    結果:

    { "data" : "ไม้เมือง", "strLenCP" : 8, "strLenBytes" : 24 }
    { "data" : "ไ", "strLenCP" : 1, "strLenBytes" : 3 }
    { "data" : "ม้", "strLenCP" : 2, "strLenBytes" : 6 }
    { "data" : "เ", "strLenCP" : 1, "strLenBytes" : 3 }
    { "data" : "มื", "strLenCP" : 2, "strLenBytes" : 6 }
    { "data" : "อ", "strLenCP" : 1, "strLenBytes" : 3 }
    { "data" : "ง", "strLenCP" : 1, "strLenBytes" : 3 }

    1. マングースはネストされた配列にデータを入力します

    2. サービススタックRedisリストの更新

    3. MongoDB-配列の最後の要素をクエリしますか?

    4. MongoDBのクエリで正規表現変数を使用するにはどうすればよいですか?