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 }