$binarySize(集計)
定義
$binarySize
指定された文字列またはバイナリ データ値の内容のサイズをバイト単位で返します。
$binarySize
の構文は次のとおりです。{ $binarySize: <string or binData> } 引数は、string またはバイナリ データ値のいずれかに解決される限り、任意の有効な式にすることができます。 式の詳細については、「式演算子 」を参照してください。
動作
$binarySize
の引数は次のいずれかに解決される必要があります。
string、
バイナリ データ値、または
null。
引数が string またはバイナリ データ値の場合、式は引数のサイズをバイト単位で返します。
引数が null
の場合、式は null
を返します。
引数が他のデータ型に解決される場合、 $binarySize
はエラーを返します。
string サイズの計算
$binarySize
の引数が string の場合、演算子は各文字が 1 バイトから 4 バイトの間を使用できる string 内の UTF- 8でエンコードされたバイト数をカウントします。
たとえば、US-ASCII 文字は 1 バイトを使用してエンコードされます。 発音区別符号を持つ文字と追加のラテン文字(アルファベットの外のラテン文字)を持つ文字は、2 バイトを使用してエンコードされます。 中国語、日本語、 韓国語の文字は通常 3 バイト必要であり、Unicode の他のプレーン(文字列、数学記号など)には 4 バイトが必要です。
次の例について考えてみます。
例 | 結果 | ノート | |
---|---|---|---|
| 5 | 各文字は 1 バイトを使用してエンコードされます。 | |
| 12 | 各文字は 1 バイトを使用してエンコードされます。 | |
| 9 | 各文字は 1 バイトを使用してエンコードされます。 | |
| 11 | é は 2 バイトを使用してエンコードされます。 | |
| 0 | 空の文字列は 0 を返します。 | |
| 7 | € は 3 バイトを使用してエンコードされます。 λ は 2 バイトを使用してエンコードされています。 | |
| 6 | 各文字は 3 バイトを使用してエンコードされます。 |
例
mongosh
では、次のドキュメントを含むimages
という名前のサンプル コレクションが作成されます。
db.images.insertMany([ { _id: 1, name: "cat.jpg", binary: new BinData(0, "OEJTfmD8twzaj/LPKLIVkA==")}, { _id: 2, name: "big_ben.jpg", binary: new BinData(0, "aGVsZmRqYWZqYmxhaGJsYXJnYWZkYXJlcTU1NDE1Z2FmZCBmZGFmZGE=")}, { _id: 3, name: "tea_set.jpg", binary: new BinData(0, "MyIRAFVEd2aImaq7zN3u/w==")}, { _id: 4, name: "concert.jpg", binary: new BinData(0, "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=")}, { _id: 5, name: "empty.jpg", binary: new BinData(0, "") } ])
次の集計 projects
:
name
フィールドimageSize
フィールド。$binarySize
を使用してドキュメントのbinary
フィールドのサイズをバイト単位で返します。
db.images.aggregate([ { $project: { "name": "$name", "imageSize": { $binarySize: "$binary" } } } ])
この操作では、次の結果を返します。
{ "_id" : 1, "name" : "cat.jpg", "imageSize" : 16 } { "_id" : 2, "name" : "big_ben.jpg", "imageSize" : 41 } { "_id" : 3, "name" : "teaset.jpg", "imageSize" : 16 } { "_id" : 4, "name" : "concert.jpg", "imageSize" : 269 } { "_id" : 5, "name" : "empty.jpg", "imageSize" : 0 }
最大バイナリ データの検索
次のパイプラインは、バイナリ データ サイズが最大のイメージを返します。
db.images.aggregate([ // First Stage { $project: { name: "$name", imageSize: { $binarySize: "$binary" } } }, // Second Stage { $sort: { "imageSize" : -1 } }, // Third Stage { $limit: 1 } ])
- 第 1 ステージ
パイプラインの第一ステージ
projects
:name
フィールドimageSize
フィールド。$binarySize
を使用してドキュメントのbinary
フィールドのサイズをバイト単位で返します。
このステージでは、次のドキュメントを次のステージに出力します。
{ "_id" : 1, "name" : "cat.jpg", "imageSize" : 16 } { "_id" : 2, "name" : "big_ben.jpg", "imageSize" : 41 } { "_id" : 3, "name" : "teaset.jpg", "imageSize" : 16 } { "_id" : 4, "name" : "concert.jpg", "imageSize" : 269 } { "_id" : 5, "name" : "empty.jpg", "imageSize" : 0 } - 第 2 ステージ
第二ステージでは、
sorts
のドキュメントをimageSize
で降順で並べ替えます。このステージでは、次のドキュメントを次のステージに出力します。
{ "_id" : 4, "name" : "concert.jpg", "imageSize" : 269 } { "_id" : 2, "name" : "big_ben.jpg", "imageSize" : 41 } { "_id" : 1, "name" : "cat.jpg", "imageSize" : 16 } { "_id" : 3, "name" : "teaset.jpg", "imageSize" : 16 } { "_id" : 5, "name" : "empty.jpg", "imageSize" : 0 } - 第 3 ステージ
第三ステージ
limits
では、出力ドキュメントをソート順で最初に表示されるドキュメントのみ返します。{ "_id" : 4, "name" : "concert.jpg", "imageSize" : 269 }