MongoDBには、$strLenBytesが含まれています および$strLenCP 集約パイプラインフレームワークの演算子。これらの演算子は似ていますが、わずかに異なることを行います。両方がまったく同じ結果を返す場合もあれば、結果が異なる場合もあります。
これら2つの演算子の違いの概要は次のとおりです。
違い
各演算子の定義は次のとおりです。
-
$strLenBytesUTF-8でエンコードされたバイト数を返します 指定された文字列内 -
$strLenCPUTF-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 }