106

mongo の奇妙な動作に遭遇したので、少し説明したいと思います...
私の要求は単純です: コレクション内の単一ドキュメントのサイズを取得したいと思います。私は2つの可能な解決策を見つけました:

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

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

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

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

    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
    
4

6 に答える 6

46

最大ドキュメント サイズ 16 MiB ( source )


バージョンが 4.4 以上の場合 ( $bsonSize source )

db.users.aggregate([
  {
    "$project": {
      "size_bytes": { "$bsonSize": "$$ROOT" },
      "size_KB": { "$divide": [{"$bsonSize": "$$ROOT"}, 1000] },
      "size_MB": { "$divide": [{"$bsonSize": "$$ROOT"}, 1000000] }
    }
  }
])

バージョンが 4.4 未満の場合 ( Object.bsonSize() source )

このスクリプトを使用して、実際のサイズを取得できます。

db.users.find().forEach(function(obj)
{
  var size = Object.bsonsize(obj);
  print('_id: '+obj._id+' || Size: '+size+'B -> '+Math.round(size/(1000))+'KB -> '+Math.round(size/(1000*1000))+'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/(1000)), 
    'MB': Math.round(size/(1000*1000))
  };
  print(stats);
});

これには JSON を返すという利点もあるため、RoboMongo のような GUI で表にすることができます。


編集 : @zAlbeeの提案の完成に感謝します。

于 2016-12-06T10:33:10.167 に答える