1. ホーム
  2. node.js

[解決済み] DeprecationWarning: collection.findAndModify は非推奨です。代わりに findOneAndUpdate, findOneAndReplace, findOneAndDelete を使ってください。

2023-04-30 14:42:21

質問

mongooseを使っています。 findOneAndUpdate を使用していますが、まだエラーが発生します。

DeprecationWarning: collection.findAndModify は非推奨です。代わりにfindOneAndUpdate, findOneAndReplace, findOneAndDeleteを使ってください。

しかし、私は findAndModify を使用していないのに、なぜ私のクエリを findAndModify ?

どのように解決するのですか?

クエリでオプションを設定する必要があります。 useFindAndModify から false で述べたように ドキュメント .

(検索キーワード 現在サポートされているオプションは )

'useFindAndModify': デフォルトではtrue。falseに設定すると findOneAndUpdate() および findOneAndRemove() が findAndModify() ではなく、ネイティブの findOneAndUpdate() を使用するようにするには false を設定します。 findOneAndUpdate() と findOneAndRemove() を findAndModify() ではなく、ネイティブの findOneAndUpdate() を使うようにします。

で、mongooseの定義ファイルを見ると、findAndModify updateコマンドを呼び出すことが書かれています。

 /**
  * Issues a mongodb findAndModify update command.
  * Finds a matching document, updates it according to the update arg, 
    passing any options,
  * and returns the found document (if any) to the callback. The query 
    executes immediately
  * if callback is passed else a Query object is returned.
  */
 findOneAndUpdate(): DocumentQuery<T | null, T>;

最近 mongoose ドキュメントで更新された ( ここをクリック ) で、これらの非推奨について言及されています。

Mongoose の findOneAndUpdate() は MongoDB ドライバの 関数を使うようになってからだいぶ経つので、MongoDB ドライバの findAndModify() 関数を使います。

の使用を回避する方法は3つ以上あります。 FindAndModify :

  1. Globalレベルで。オプションを false に設定します。
// Make Mongoose use `findOneAndUpdate()`. Note that this option is `true`
// by default, you need to set it to false.
mongoose.set('useFindAndModify', false);

  1. 接続レベル:接続オプションを使用して設定することができます。
    mongoose.connect(uri, { useFindAndModify: false });

  1. クエリレベルで
   await ModelName.findOneAndUpdate({matchQuery},
   {$set: updateData}, {useFindAndModify: false});