Mongodbで単一のドキュメントのサイズを取得するにはどうすればよいですか?


87

モンゴの奇妙な振る舞いに遭遇したので、それを少し明確にしたいと思います...
私の要求は次のように単純です:コレクション内の単一のドキュメントのサイズを取得したい。私は2つの可能な解決策を見つけました:

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

  • 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
    

回答:


181

の前回の呼び出しでObject.bsonsize()、Mongodbはドキュメントではなくカーソルのサイズを返しました。

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

Object.bsonsize(db.test.findOne())

ではfindOne()、あなたは、特定のドキュメントのためのクエリを定義することができます。

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

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


1
クエリでドキュメントのリストのサイズを取得するにはどうすればよいですか?
レオン2015

しかしもちろん、このコードはサイズを計算する前にドキュメントをフェッチします。
Sercan Ozdemir 2016年

これはgooodサイズを返しません:(...しかしこれ:stackoverflow.com/a/40993183/3933634
Liberateur

4
Object.bsonsizeを取得する方法、importまたはrequiredステートメントは何ですか?
PARAMANANDAPRADHAN19年1

8
それを逃した他の人のために、あなたはfindOne代わりに使う必要がありますfind
Sam

36

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

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で表にまとめることができます。

ソース:https//stackoverflow.com/a/16957505/3933634

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


これはまさに私が探しているものですが、おそらく私のmongoバージョンに関連して機能していません。現在のものは3.4ですか?
Erce 2018

他の誰かが取得していTypeError: Object.bsonsize is not a functionますか?
フェリックスパラディス

モンゴシェルで試してみましたか?それの仕事:docs.mongodb.com/manual/reference/mongo-shell/#miscellaneous
Liberateur

適切なラベルはむしろ'KiB': Math.round(size/(1024)), 'MiB': Math.round(size/(1024*1024))(または'kB': Math.round(size/(1000)), 'MB': Math.round(size/(1000*1000))
WernfriedDomscheit20年

31

レコードパディングメカニズムにより、ドキュメントがコレクション内で占める有効なスペース量は、ドキュメントのサイズよりも大きくなります。

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

ドキュメントの正確なサイズ(バイト単位)を取得するには、Object.bsonsize()関数に固執します。


お返事ありがとうございます。その場合、この問題に関して別の質問があります。識別子の長いリストを持つドキュメントがリストの形式で保存されているコレクションがあるとします。(識別子は元々txt-csvファイルに保存されています-サイズ300 kB、各識別子の長さは10文字です)このようなドキュメントでbsonsizeを実行すると、サイズは481よりもさらに小さくなります。465が返されます。この状況について説明してください。お願いします?
user1949763 2014

4
mongDBドキュメントのサイズ制限を適用するために使用されるサイズはどれですか?Object.bsonsize()?
John Evans

MongoDBドキュメントサイズはMongoの制約であり、これはMongoのWebサイトのマニュアル16MBで説明されています。レコードのインポートを何度も試みて、この制限に達しました。
htm11h 2016年

3

mongodb 4.4(近日公開)では、bsonSize演算子を使用してドキュメントサイズを取得できます。

db.test.aggregate([
  {
    "$project": {
      "name": 1,
      "object_size": { "$bsonSize": "$$ROOT" }
    }
  }
])

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.