雑共有です。 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ドキュメントサイズが大きいと、
- チャンク移動などに時間が掛かる
- メモリキャッシュ的にドキュメントサイズが大きいとキャッシュできる数が減る
とかデメリットありますので、あまりサイズが大きくならないような設計が望ましいと思います。