web-dev-qa-db-fra.com

DeprecationWarning: collection.findAndModify est obsolète. Utilisez plutôt findOneAndUpdate, findOneAndReplace ou findOneAndDelete?

J'utilise mangouste findOneAndUpdate mais j'obtiens toujours l'erreur,

DeprecationWarning: collection.findAndModify est obsolète. Utilisez plutôt findOneAndUpdate, findOneAndReplace ou findOneAndDelete.

Mais je n'utilise même pas findAndModify, pourquoi convertit-il ma requête en findAndModify?

28
Sudhanshu Gaur

Vous devez définir l'option de la requête useFindAndModify sur false, comme indiqué dans docs .

(mot-clé de recherche . Les options actuellement prises en charge sont )

'useFindAndModify': true par défaut. Définissez sur false pour que findOneAndUpdate () et findOneAndRemove () utilisent natif findOneAndUpdate () plutôt que findAndModify ().

et si vous voyez le fichier de définition de mangouste, il est mentionné qu'il appelle la commande 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>;

Récemment mis à jour dans la documentation Mangouste ( Cliquez ici ) pour ces déprécations où mentionné:

La fonction findOneAndUpdate () de Mongoose est antérieure à la fonction findOneAndUpdate () du pilote MongoDB. Elle utilise donc la fonction findAndModify () du pilote MongoDB.

Il existe trois manières, voire plus, d'éviter l'utilisation de FindAndModify:

  1. Au niveau global: définissez l'option sur 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. Au niveau de la connexion: nous pouvons configurer en utilisant les options de connexion:
    mongoose.connect(uri, { useFindAndModify: false });
  1. Au niveau de la requête:
   await ModelName.findOneAndUpdate({matchQuery},
   {$set: updateData}, {useFindAndModify: false});

37
Shivam Pandey

Changez la configuration de la mangouste globalement comme ceci:

mongoose.set('useFindAndModify', false);

Ou passez les options dans votre chaîne de requête comme ceci:

Person.findOneAndUpdate({_id: id}, {$set: body}, {new: true, useFindAndModify: false}).then(..

Vous pouvez également gérer les autres avertissements relatifs à la dépréciation des mangoustes sous la forme d'une mention docs

mongoose.set('useNewUrlParser', true);
mongoose.set('useCreateIndex', true);

C'est ça.

12
Ikram - Ud - Daula

vous pouvez également passer les options à la connexion avec l'option de besoin useNewUrlParser. Regardez ce qui suit -> https://mongoosejs.com/docs/deprecations.html

mongoose.connect(config.MONGODB_URI, { useNewUrlParser: true, useFindAndModify: false}); 
5
Polliny

Vous devez modifier les options de votre méthode de connexion pour vous en débarrasser:

mongoose.connect("mongodb://localhost/DB_Name", {
  keepAlive: true,
  useNewUrlParser: true,
  useCreateIndex: true,
  useFindAndModify: false
});

Vous pouvez utiliser comme ça.

0
Devesh