web-dev-qa-db-ja.com

Mongo =単一ドキュメントのサイズを取得

Mongoの奇妙な振る舞いに遭遇したので、少しはっきりさせたいと思います...
リクエストは簡単です。コレクション内の単一のドキュメントのサイズを取得したいと思います。私は2つの可能な解決策を見つけました:

  • Object.bsonsize-サイズをバイト単位で返す必要があるjavascriptメソッド
  • db.collection.stats()-データに「集約された」(平均)サイズのビューを生成する「avgObjSize」行があります。単一のドキュメントの平均サイズを単に表します。

  • 1つのドキュメントのみでテストコレクションを作成すると、両方の関数が異なる値を返します。どうして可能ですか?
    mongoドキュメントのサイズを取得する他の方法はありますか?

ここで、テストを実行するコードをいくつか提供します。

  1. 新しいデータベース 'test'を作成し、1つの属性(type: "auto")のみを持つ単純なドキュメントを入力

    db.test.insert({type:"auto"})
    
  2. 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
    

    }

  3. bsonsize関数呼び出しからの出力:Object.bsonsize(db.test.find({test: "auto"}))

    481
    
62
user1949763

私は解決策を見つけました。 Object.bsonsizeの以前の呼び出しで、mongoはドキュメント自体ではなくカーソルのサイズを返しました。

正しい方法は、次のコマンドを使用することです。

Object.bsonsize(db.test.findOne({type:"auto"}))

これにより、特定のドキュメントの正しいサイズ(バイト単位)が返されます。

139
user1949763

レコードの埋め込み メカニズムにより、コレクションでドキュメントが使用する有効なスペースは、ドキュメントのサイズよりも大きくなります。

これが、db.test.stats()Object.bsonsize(..)の出力に違いがある理由です。

ドキュメントのexactサイズ(バイト単位)を取得するには、Object.bsonsize()関数を使用します。

27

このスクリプトを使用して実際のサイズを取得することをお勧めします。

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 に感謝します。完了を提案してください。

20
Liberateur