4

Node.js と MongoDB/Mongoose を使用して Web アプリケーションを開発しています。最もよく使用されるモデルである Record には、多くのサブドキュメント配列があります。たとえば、「コメント」、「予約」、「購読者」などがあります。

クライアント側のアプリケーションでは、ユーザーが「削除」ボタンを押すたびに、その特定のコメントの削除ルートへの AJAX 要求が開始されます。私が直面している問題は、これらの AJAX 呼び出しの多くが一度に着信すると、Mongoose が呼び出しの一部 (すべてではない) で「ドキュメントが見つかりません」というエラーで失敗することです。

これは、一度に多数の呼び出しが迅速に行われた場合にのみ発生します。これは、Mongoose のバージョンが原因でドキュメントの競合が発生したためだと思います。現在の削除プロセスは次のとおりです。

  1. を使用してドキュメントを取得しますRecord.findById()
  2. 適切な配列からサブドキュメントを削除します(たとえば、を使用comment.remove()
  3. 電話record.save()

オペレーターRecord.findByIdAndUpdateを使用してコレクションを手動で更新できるソリューションを見つけました。$pullただし、これは、mongoose のミドルウェアを使用できず、バージョン管理が完全に失われることを意味します。そして、考えれば考えるほど、これが発生する状況に気づき、findByIdAndUpdateまたはのようなMongooseのラッパー関数を使用する必要がありfindAndRemoveます。私が考えることができる他の唯一の解決策は、削除の試行をwhileループに入れて、それが機能することを期待することですが、これは非常に貧弱な修正のようです.

Mongoose ラッパーを使用しても、基本的には Mongoose を使用する大きな利点の 1 つであるミドルウェアやフックをまったく使用できないため、問題は解決しません。

これは、Mongoose は基本的に高速編集には役に立たず、ネイティブの MongoDB ドライバーを使用した方がよいということですか? Mongoose の制限を誤解していますか? どうすればこの問題を解決できますか?

4

4 に答える 4

0

これらの配列を新しいコレクションに引き出すことを強くお勧めします。たとえば、各ドキュメントが属する場所を示すレコード ID を持つコメント コレクション。これは、はるかにスケーラブルなソリューションです。

おっしゃるとおり、Mongoose の配列操作はアトミックではないため、うまくスケーリングできません。

于 2014-02-08T05:24:13.783 に答える