[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 を定義することで解決できたので、その実例をご紹介します。
エラーが発生したときに使っていたウェブアプリケーションのアーキテクチャは下記のとおりです。
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 になる前にスロークエリを適宜チェックする仕組みづくりをしていきたいですね。
以上、スロークエリ警察に摘発されたくない、現場からお送りしました。