[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 を定義することで解決できたので、その実例をご紹介します。

MongoDB | モンゴディービー

アーキテクチャ

エラーが発生したときに使っていたウェブアプリケーションのアーキテクチャは下記のとおりです。

  • 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 になる前にスロークエリを適宜チェックする仕組みづくりをしていきたいですね。

以上、スロークエリ警察に摘発されたくない、現場からお送りしました。