[Mongoose] RangeError: attempt to write outside buffer bounds の解決方法
Express (Node.js) + Mongoose (MongoDB) な構成のシステムで RangeError: attempt to write outside buffer bounds が発生したときの解決方法をご紹介します。
(検証) BSON document の最大サイズは 16 MB
(エラー) object to insert too large. size in bytes: xxx, max size: 16777216
BSON Document Size
The maximum BSON document size is 16 megabytes.
1 MB = 1,048,576 B
なので、
var str = ''; var MB = 1048576; for (var i = 0; i < 16 * MB; i++) { str += '0'; } db.test.insert({ 'a' : str }) /** WriteResult({ "nInserted" : 0, "writeError" : { "code" : 2, "errmsg" : "object to insert too large. size in bytes: 16777246, max size: 16777216" } }) **/ |
(成功) 16777216 byte なら db.collection.insert() できる
var str = ''; var MB = 1048576; var diff = 30; for (var i = 0; i < ((16 * MB) - diff); i++) { str += '0'; } db.test.insert({ 'a' : str }) // WriteResult({ "nInserted" : 1 }) Object.bsonsize(db.test.find().sort({ _id : -1 })[0]) // 16777216 |
RangeError の解決方法
1 document に保存するサイズが大きすぎるので、小さくしましょう。
普通に使っていれば 1 document が 16 MB になることも無いと思いますが・・・。
以上、Mongoose で RangeError が突然発生してビックリした現場からお送りしました。