[MongoDB] “sort stage buffered data usage of x bytes exceeds internal limit of 33554432 bytes” エラーの解決方法
Node.js + MongoDB のウェブアプリで、突然 Unable to execute query: errmsg: “sort stage buffered data usage of x bytes exceeds internal limit of 33554432 bytes” というエラーが発生するようになりました。
MongoDB の field に index を定義することで解決できたので、その実例をご紹介します。
アーキテクチャ
エラーが発生したときに使っていたウェブアプリケーションのアーキテクチャは下記のとおりです。
- Express.js (Node.js)
- Mongoose (MongoDB)
実例 Mongoose で index 定義してない field で sort してエラー
Node.js + Mongoose のコードでエラーが発生したときのコードと、解決したコードをそれぞれご紹介していきます。
エラーが発生するコード
エラーが発生したときのコードは sort() に利用している field に index が定義されていなかっただけでした。
const userScheme = new Scheme({ // 省略 loginAt: { type: Date } }); // find query User.find().sort({ loginAt : -1 }); |
解決したコード
以下のように適切に index を定義してあげるだけで OK です。
const userScheme = new Scheme({ // 省略 loginAt: { type: Date, index: true } }); |
もしくは、
userScheme.index({ loginAt: 1 }); |
です。
まとめ
MongoDB の 1 collection に保存されている document 数が、だいたい 5000 ~ 6000 ぐらいでこのエラーが発生します。
Fatal error になる前にスロークエリを適宜チェックする仕組みづくりをしていきたいですね。
以上、スロークエリ警察に摘発されたくない、現場からお送りしました。