$bsonSize(集計)
定義
動作
引数がオブジェクトの場合、式はオブジェクトがBSONとしてエンコードされているときのオブジェクトのサイズをバイト単位で返します。
引数が null
の場合、式は null
を返します。
引数がオブジェクトまたはnull
以外のデータ型に解決される場合、 $bsonSize
エラーが発生します。
例
ドキュメントのサイズを返す
mongosh
では、次のドキュメントを含むemployees
という名前のサンプル コレクションが作成されます。
db.employees.insertMany([ { "_id": 1, "name": "Alice", "email": "alice@company.com", "position": "Software Developer", "current_task": { "project_id": 1, "project_name": "Aggregation Improvements", "project_duration": 5, "hours": 20 } }, { "_id": 2, "name": "Bob", "email": "bob@company.com", "position": "Sales", "current_task": { "project_id": 2, "project_name": "Write Blog Posts", "project_duration": 2, "hours": 10, "notes": "Progress is slow. Waiting for feedback." } }, { "_id": 3, "name": "Charlie", "email": "charlie@company.com", "position": "HR (On Leave)", "current_task": null }, { "_id": 4, "name": "Dianne", "email": "diane@company.com", "position": "Web Designer", "current_task": { "project_id": 3, "project_name": "Update Home Page", "notes": "Need to scope this project." } } ]);
次の集計 projects
:
name
フィールドobject_size
フィールド。$bsonSize
を使用してドキュメントのサイズをバイト単位で返します。$$ROOT
変数は、パイプラインによって現在処理されているドキュメントを参照します。 集計パイプラインの変数の詳細については、「集計式の変数 」を参照してください。
db.employees.aggregate([ { "$project": { "name": 1, "object_size": { $bsonSize: "$$ROOT" } } } ])
この操作では、次の結果を返します。
{ "_id" : 1, "name" : "Alice", "object_size" : 222 } { "_id" : 2, "name" : "Bob", "object_size" : 248 } { "_id" : 3, "name" : "Charlie", "object_size" : 112 } { "_id" : 4, "name" : "Dianne", "object_size" : 207 }
コレクション内のすべてのドキュメントの合計サイズを返す
次のパイプラインは、 employees
コレクション内のすべてのドキュメントの合計サイズを返します。
db.employees.aggregate([ { "$group": { "_id": null, "combined_object_size": { $sum: { $bsonSize: "$$ROOT" } } } } ])
$group
_id 値として null
またはその他の定数値を指定すると、 $group
ステージではすべての入力ドキュメント全体の累積値が計算されます。
この操作では$sum
演算子を使用して、コレクション内の各ドキュメントの結合された$bsonSize
を計算します。 $$ROOT
変数は、パイプラインによって現在処理されているドキュメントを参照します。 集計パイプラインの変数の詳細については、「集計式の変数 」を参照してください。
この操作では、次の結果を返します。
{ "_id" : null, "combined_object_size" : 789 }
指定したフィールドが最大のドキュメントを返す
次のパイプラインは、バイト数が最大の current_task
フィールドを持つドキュメントを返します。
db.employees.aggregate([ // First Stage { $project: { name: "$name", task_object_size: { $bsonSize: "$current_task" } } }, // Second Stage { $sort: { "task_object_size" : -1 } }, // Third Stage { $limit: 1 } ])
- 第 1 ステージ
パイプラインの第一ステージ
projects
:name
フィールドtask_object_size
フィールド。$bsonSize
を使用してドキュメントのcurrent_task
フィールドのサイズをバイト単位で返します。
このステージでは、次のドキュメントを次のステージに出力します。
{ "_id" : 1, "name" : "Alice", "task_object_size" : 109 } { "_id" : 2, "name" : "Bob", "task_object_size" : 152 } { "_id" : 3, "name" : "Charlie", "task_object_size" : null } { "_id" : 4, "name" : "Dianne", "task_object_size" : 99 } - 第 2 ステージ
第二ステージでは、
sorts
のドキュメントをtask_object_size
で降順で並べ替えます。このステージでは、次のドキュメントを次のステージに出力します。
{ "_id" : 2, "name" : "Bob", "task_object_size" : 152 } { "_id" : 1, "name" : "Alice", "task_object_size" : 109 } { "_id" : 4, "name" : "Dianne", "task_object_size" : 99 } { "_id" : 3, "name" : "Charlie", "task_object_size" : null } - 第 3 ステージ
第三ステージ
limits
では、出力ドキュメントをソート順で最初に表示されるドキュメントのみ返します。{ "_id" : 2, "name" : "Bob", "task_object_size" : 152 }