Mongoの奇妙な振る舞いに遭遇したので、少しはっきりさせたいと思います...
リクエストは簡単です。コレクション内の単一のドキュメントのサイズを取得したいと思います。私は2つの可能な解決策を見つけました:
ここで、テストを実行するコードをいくつか提供します。
新しいデータベース 'test'を作成し、1つの属性(type: "auto")のみを持つ単純なドキュメントを入力
db.test.insert({type:"auto"})
stats()関数呼び出しからの出力:db.test.stats():
{
"ns" : "test.test",
"count" : 1,
"size" : 40,
"avgObjSize" : 40,
"storageSize" : 4096,
"numExtents" : 1,
"nindexes" : 1,
"lastExtentSize" : 4096,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 8176,
"indexSizes" : {
"_id_" : 8176
},
"ok" : 1
}
bsonsize関数呼び出しからの出力:Object.bsonsize(db.test.find({test: "auto"}))
481
私は解決策を見つけました。 Object.bsonsizeの以前の呼び出しで、mongoはドキュメント自体ではなくカーソルのサイズを返しました。
正しい方法は、次のコマンドを使用することです。
Object.bsonsize(db.test.findOne({type:"auto"}))
これにより、特定のドキュメントの正しいサイズ(バイト単位)が返されます。
レコードの埋め込み メカニズムにより、コレクションでドキュメントが使用する有効なスペースは、ドキュメントのサイズよりも大きくなります。
これが、db.test.stats()
とObject.bsonsize(..)
の出力に違いがある理由です。
ドキュメントのexactサイズ(バイト単位)を取得するには、Object.bsonsize()
関数を使用します。
このスクリプトを使用して実際のサイズを取得することをお勧めします。
db.users.find().forEach(function(obj)
{
var size = Object.bsonsize(obj);
print('_id: '+obj._id+' || Size: '+size+'B -> '+Math.round(size/(1024))+'KB -> '+Math.round(size/(1024*1024))+'MB (max 16MB)');
});
注:IDが64ビット整数である場合、上記は印刷時にID値を切り捨てます!その場合は、代わりに使用できます:
db.users.find().forEach(function(obj)
{
var size = Object.bsonsize(obj);
var stats =
{
'_id': obj._id,
'bytes': size,
'KB': Math.round(size/(1024)),
'MB': Math.round(size/(1024*1024))
};
print(stats);
});
これにはJSONを返すという利点もあるため、RoboMongoのようなGUIでJSONを集計できます!
ソース: https://stackoverflow.com/a/16957505/3933634
編集: @ zAlbee に感謝します。完了を提案してください。