MongoDB 4.4から、$bsonSize
を使用できます 指定されたドキュメントのサイズをバイト単位で返す集約パイプライン演算子。
$bsonSize
オブジェクトまたはnull
のいずれかに解決される限り、任意の有効な式を受け入れます 。
例
bars
というコレクションがあるとします。 次のドキュメントで:
{ "_id" : 1, "name" : "Boardwalk Social", "location" : { "type" : "Point", "coordinates" : [ -16.919297718553366, 145.77675259719823 ] }, "categories" : [ "Bar", "Restaurant", "Hotel" ], "reviews" : [ { "name" : "Steve", "date" : "20 December, 2020", "rating" : 5, "comments" : "Great vibe." }, { "name" : "Lisa", "date" : "25 October, 2020", "rating" : 3, "comments" : "They just raised their prices :(" }, { "name" : "Kim", "date" : "21 October, 2020", "rating" : 4, "comments" : "Nice for Friday happy hour" } ] }
location
フィールドにはドキュメントが含まれます。そしてreviews
フィールドにはドキュメントの配列が含まれています。
$bsonSize
を使用しましょう location
のサイズを確認する演算子 フィールド:
db.bars.aggregate([
{
$project: {
"locationSize": { $bsonSize: "$location" }
}
}
])
結果:
{ "_id" : 1, "locationSize" : 61 }
この場合、location
のサイズ フィールドは61バイトです。
配列内のオブジェクト
配列の要素であるドキュメントのサイズを取得する例を次に示します。
db.bars.aggregate([
{
$project: {
"review": { $arrayElemAt: [ "$reviews", 0 ] },
"reviewSize": { $bsonSize: { $arrayElemAt: [ "$reviews", 0 ] } }
}
}
]).pretty()
結果:
{ "_id" : 1, "review" : { "name" : "Steve", "date" : "20 December, 2020", "rating" : 5, "comments" : "Great vibe." }, "reviewSize" : 91 }
この場合、$arrayElemAt
を使用します 実際のレビューを返し、次にそのレビューのサイズを返します。
MongoDBアレイはゼロベースであるため、レビューは最初のレビューです。
トップレベルのドキュメントのサイズを取得する
$$ROOT
を使用できます トップレベルのドキュメントまたはルートドキュメントを参照するシステム変数。これは、現在パイプラインによって処理されているドキュメントです。
したがって、$$ROOT
を渡すことができます $bsonSize
への変数 現在処理中のドキュメント全体のサイズを取得します。
例:
db.bars.aggregate([
{
$project: {
"rootSize": { $bsonSize: "$$ROOT" }
}
}
])
結果:
{ "_id" : 1, "rootSize" : 502 }
この場合、ドキュメントは502バイトです。
間違ったデータ型
前述のように、$bsonSize
オブジェクトまたはnull
に解決される限り、任意の有効な式を受け入れます 。
別のBSONタイプに解決される式を提供するとどうなるかの例を次に示します。
db.bars.aggregate([
{
$project: {
"nameSize": { $bsonSize: "$name" }
}
}
])
結果:
Error: command failed: { "ok" : 0, "errmsg" : "$bsonSize requires a document input, found: string", "code" : 31393, "codeName" : "Location31393" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
この場合、文字列のサイズを見つけようとしましたが、サポートされているBSONタイプの1つではないため、エラーが発生します。
ただし、すべてが失われるわけではありません。 $binarySize
を使用できます 文字列のサイズを取得します。
コレクション内のすべてのドキュメントの合計サイズを取得する
cats
というコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" } { "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 3, "name" : "Fluffy", "height" : 15 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 } { "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
前に示したように、$$ROOT
を使用できます 現在処理中のトップレベルのドキュメントを返すには:
db.cats.aggregate([
{
$project: {
"rootSize": { $bsonSize: "$$ROOT" }
}
}
])
結果:
{ "_id" : 1, "rootSize" : 58 } { "_id" : 2, "rootSize" : 49 } { "_id" : 3, "rootSize" : 51 } { "_id" : 4, "rootSize" : 48 } { "_id" : 5, "rootSize" : 40 } { "_id" : 6, "rootSize" : 48 }
ただし、合計も取得できます コレクション内のすべてのドキュメントのサイズ。
これは次のように実現できます。
db.cats.aggregate([
{
$group: {
"_id": null,
"rootSize": { $sum: { $bsonSize: "$$ROOT" } }
}
}
])
結果:
{ "_id" : null, "rootSize" : 294 }
ここでは、$group
を使用して結果をグループ化しました。 演算子と_id
の提供 null
の 。他の定数値を使用することもできます。
$sum
も使用しました さまざまなドキュメントの合計サイズを計算します。
コレクション内のすべてのドキュメントの合計サイズは294であることがわかります。これは、前の例の結果を合計することで確認できます。
Object.bsonSize()メソッド
ドキュメントのサイズを取得する別の方法は、Object.bsonSize()
を使用することです。 メソッド。