LoginSignup
0
0

More than 3 years have passed since last update.

MongoDBの1ドキュメントサイズは16MByte上限だけど、プロパティ数的にはどのくらいか?出してみた

Last updated at Posted at 2019-04-26

雑共有です。 1024 / 1024 は、単位をMbyteにするためです。

$ mongo --version
MongoDB shell version v4.0.9
git version: fc525e2d9b0e4bceff5c2201457e564362909765
build environment:
    distmod: ubuntu1804
    distarch: x86_64
    target_arch: x86_64
# ↑出力をちょっと省略しています

// 長いプロパティ名
var obj = {"_id" : ObjectId("5cc27f54856171bb356878b0")};
for (var i = 0; i < 30 * 10000; i++) {
  obj["123456789012345678901234567890" + i] = 100;
}
Object.bsonsize(obj) / 1024 / 1024;
> 13.054763793945312

// 数値のみプロパティ名(0番からスタート)
var obj = {"_id" : ObjectId("5cc27f54856171bb356878b0")};
for (var i = 0; i < 30 * 10000; i++) {
  obj[i] = 100;
}
Object.bsonsize(obj) / 1024 / 1024;
> 4.4716949462890625

// 数値のみプロパティ名(10万番台からスタート)
var obj = {"_id" : ObjectId("5cc27f54856171bb356878b0")};
for (var i = 0; i < 30 * 10000; i++) {
  obj[i + 100001] = 100;
}
Object.bsonsize(obj) / 1024 / 1024;
> 4.577657699584961

// ちょっと深堀ってみたデータ
var obj = {"_id" : ObjectId("5cc27f54856171bb356878b0"), aaa:{}, bbb:{}, ccc:{}, ddd:{}};
for (var i = 0; i < 30 * 10000; i++) {
  var num = i + 100001;
  var prop = "aaa";
  if ((num % 4) === 0) {
    prop = "aaa"
  }
  if ((num % 4) === 1) {
    prop = "bbb"
  }
  if ((num % 4) === 2) {
    prop = "ccc"
  }
  if ((num % 4) === 3) {
    prop = "ddd"
  }
  obj[prop][num] = 100;
}
Object.bsonsize(obj) / 1024 / 1024;
> 4.577695846557617

// 110万プロパティで、16MB超えた場合
var obj = {"_id" : ObjectId("5cc27f54856171bb356878b0")};
for (var i = 0; i < 110 * 10000; i++) {
  obj[i + 100001] = 100;
}
Object.bsonsize(obj) / 1024 / 1024;
> 2019-04-26T12:51:35.489+0900 E QUERY    [js] Error: Converting from JavaScript to BSON failed: Object size 17800019 exceeds limit of 16793600 bytes. :

複雑なjsonになると、もっと変わると思いますが、意外と入るなぁという印象でした。

しかし、1ドキュメントサイズが大きいと、

  • チャンク移動などに時間が掛かる
  • メモリキャッシュ的にドキュメントサイズが大きいとキャッシュできる数が減る

とかデメリットありますので、あまりサイズが大きくならないような設計が望ましいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0