Mongoose: Page de documentation expliquant comment corriger les avertissements d'obsolescence

Créé le 27 août 2018  ·  31Commentaires  ·  Source: Automattic/mongoose

Après #6917, il devrait maintenant être possible d'effacer tous les avertissements d'obsolescence en :

  • Remplacer update() par updateOne() , updateMany() , ou replaceOne()
  • Remplacer remove() par deleteOne() ou deleteMany()
  • Réglage mongoose.set('useFindAndModify', false);
  • Réglage mongoose.set('useCreateIndex', true);
  • Réglage mongoose.set('useNewUrlParser', true);

Besoin d'une page de documentation pour résumer cela.

docs

Commentaire le plus utile

Je crois que c'est mongoose.set('useCreateIndex', true)

Tous les 31 commentaires

Si ceux-ci sont définis, serait-ce incompatible avec le programme actuel ou le casserait-il ?

@isLishude, les seules différences dont nous sommes conscients sont :

1) Prise en charge de MongoDB 3.0.x
2) updateOne() et updateMany() ne prennent pas en charge l' option overwrite . Si vous utilisez update(filter, update, { overwrite: true }) , vous devriez utiliser replaceOne(filter, update) , pas updateOne(filter, update, { overwrite: true })

Si vous rencontrez d'autres problèmes, n'hésitez pas à ouvrir un problème GitHub.

J'ai défini mongoose.set('useCreateIndexes', true) et j'obtiens toujours DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead .

Je l'ai essayé avant et après mongoose.connect() .

@ulrichb Êtes-vous sûr d'utiliser [email protected] sorti il ​​y a une heure ?

Je peux reproduire ce que @ulrichb voit sur 5.2.10 avec :

6922.js

#!/usr/bin/env node
'use strict';

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
mongoose.set('useCreateIndexes', true);

const conn = mongoose.connection;
const Schema = mongoose.Schema;

const schema = new Schema({
  name: {
    type: String,
    unique: true
  }
});

const Test = mongoose.model('test', schema);

const test = new Test({ name: 'one' });

async function run() {
  console.log(`mongoose version: ${mongoose.version}`);
  await conn.dropDatabase();
  await test.save();
  return conn.close();
}

run();

Sortir:

issues: ./6922.js
mongoose version: 5.2.10
(node:7186) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
issues:

Je crois que c'est mongoose.set('useCreateIndex', true)

a mis à jour le commentaire original pour refléter l'observation de @saagar2000 . Merci @saagar2000 !

@vkarpov15 est-il possible de renommer la méthode de document remove en delete pour qu'elle soit également cohérente ? (Ou fournir un alias) ?

Actuellement, je refactorise toutes les utilisations basées sur le modèle de remove à deleteOne et deleteMany , mais les méthodes de document sont toujours appelées remove() (ce qui est également incompatible avec la méthode isDeleted() ).

Par exemple

const Foo = mongoose.model('Foo');
const foo = new Foo();
foo.remove(); //<-- create alias/rename to foo.delete()

Je vois l'avertissement collection.{remove|update} is deprecated sur les opérations Document.{remove|update} .

const doc = await model.findById(someId);
await doc.update({ $set: { someProp: true }}); // Deprecation warning
await doc.remove() // Deprecation warning

@adamreisnz ouais nous devrions ajouter un alias doc.delete() , idem pour doc.update() @mycompassspins

mongoose.set('useCreateIndex', true) n'a aucun effet pour moi. ??
obtenant toujours le 'DeprecationWarning: collection.ensureIndex est obsolète. Utilisez plutôt createIndexes.'

@ParikshitChavan Avez-vous défini cette option avant d'appeler mongoose.model() ?

Utilisation de la mangouste 5.2.12. J'obtiens également ceci : the options [useCreateIndex] is not supported en plus de l'avertissement de dépréciation.

Plus d'infos : Je ne reçois ce message supplémentaire que lorsque je passe useCreateIndex comme option de connexion. Quand j'utilise mongoose.set() je ne reçois pas ce message.

il semble que cela devrait fonctionner correctement lorsqu'il est passé en tant qu'option de connexion, mais ce n'est pas le cas. seulement après mongoose.set() explicite

@Fonger @govindrai
J'ai essayé de le faire via les options de connexion et via mongoose.set()
avant et après la connexion à la BD.
le 'DeprecationWarning: collection.ensureIndex est obsolète. Utilisez plutôt createIndexes.' semble toujours persister.

Idem ici, impossible de se débarrasser de l'avertissement collection.ensureIndex is deprecated ... Peu importe si l'utilisation est définie ou en option...

@ParikshitChavan @govindrai @Avcajaraville

Vous devez mettre mongoose.set('useCreateIndex', true) avant CHAQUE mongoose.model() appel
(Remarque : pas mongoose.connect() ).

Voir la discussion dans #6890. Ceci est corrigé dans 5.2.13 (mais ce n'est pas encore publié).

@ Fonger @ vkarpov15 après la mise à niveau vers 5.2.13, le problème persiste

(node:24769) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

package.json :

"dependencies": {
        "bcrypt": "^3.0.0",
        "connect-mongo": "^2.0.1",
        "ejs": "^2.6.1",
        "express": "^4.16.3",
        "express-session": "^1.15.6",
        "mongodb": "^3.1.4",
        "mongoose": "^5.2.13",
        "morgan": "^1.9.0",
        "passport-local": "^1.0.0"
    },

informations sur les nœuds et npm :

$ node -v
v10.6.0

$ npm -v
6.4.1

@arastu pouvez-vous créer un exemple reproductible avec un ou plusieurs fichiers dans lequel vous démontrez que vous utilisez 5.2.13 et que vous voyez un ou plusieurs de ces avertissements ?

Notez que j'appelle mongoose.set() avant de demander mes modèles

Par exemple:

index.js

#!/usr/bin/env node
'use strict';

const assert = require('assert');
const mongoose = require('mongoose');
mongoose.set('useCreateIndex', true);
mongoose.set('useFindAndModify', false);
mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
const conn = mongoose.connection;


const One = require('./one');
const Two = require('./two');

const one = new One({ name: '1' });
const two = new Two({ name: '2' });

async function run() {
  assert.strictEqual(mongoose.version, '5.2.13');
  await conn.dropDatabase();
  await Promise.all([One.init(), Two.init()]);
  await one.save();
  await two.save();
  await One.findOneAndUpdate({}, { name: 'one' });
  await Two.findOneAndUpdate({}, { name: 'two' });
  console.log(`${mongoose.version} should show no deprecations with the new settings.`);
  return conn.close();
}

run();

un.js

'use strict';

const mongoose = require('mongoose');

const schema = new mongoose.Schema({ name: { type: String, unique: true } });

module.exports = mongoose.model('one', schema);

deux.js

'use strict';

const mongoose = require('mongoose');

const schema = new mongoose.Schema({ name: { type: String, unique: true } });

module.exports = mongoose.model('two', schema);

Sortir:

6922: ./index.js
5.2.13 should show no deprecations with the new settings.
6922:

travailler pour moi en 5.2.13. @lineus sera-t-il pris en charge par useCreateIndex en tant qu'option de connexion ? Obtenez actuellement the options [useCreateIndex] is not supported

c'est à dire
mongoose.connect( process.env.MONGODB_URI, { useNewUrlParser: true, autoIndex: false, useCreateIndex: true, } )

@govindrai en ce moment, vous devriez faire mongoose.set('useCreateIndex', true) comme spécifié dans les docs d'avertissement de dépréciation . Mais nous ajouterons cela aussi.

J'ai mis à niveau vers 5.2.14 et je vois toujours des avertissements d'obsolescence qui n'ont pas de sens. Par exemple, collection.update is deprecated . . . lorsque j'utilise réellement document.update . Idem pour la méthode remove du modèle et du document. Le passage à document.updateOne produit TypeError: document.updateOne is not a function . Est-ce que j'ai râté quelque chose?

@mycompassspins Avez-vous suivi la pile produisant l'avertissement ?

Par exemple, dans mon cas, il s'avère que l'avertissement de dépréciation se produisait en raison de la connexion à mongo .

Si vous suivez les instructions ci-dessus, du moins pour moi, tous les avertissements de dépréciation ont disparu :)

Voici la pile :

DeprecationWarning: collection.update is deprecated. Use updateOne, updateMany, or bulkWrite instead.
    at NativeCollection.(anonymous function) [as update] (/MyProject/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:143:28)
    at NodeCollection.update (/MyProject/node_modules/mquery/lib/collection/node.js:66:19)
    at model.Query._updateThunk (/MyProject/node_modules/mongoose/lib/query.js:3233:23)
    at model.Query.Query._execUpdate (/MyProject/node_modules/mongoose/lib/query.js:3245:23)
    at process.nextTick (/MyProject/node_modules/kareem/index.js:333:33)
    at process._tickCallback (internal/process/next_tick.js:150:11)

De toute évidence, Model.update est en fait exécuté, même si j'appelle MongooseDocument.update . C'est ce que je fais plus ou moins :

async UpdateMyDocument(id:string, update:MyDocument):Promise<MyDocument>
{
    const doc = await MyModel.findById(id)
        .populate({ path: 'somePath', populate: [{ path: 'somePath.nested' }] });

    return await doc.update(update); // <= MongooseDocument.update is producing a Model.update deprecation warning
}

@mycompassspins êtes-vous sûr d'être au 5.2.14 ? Nous avons ajouté doc.updateOne(update) en 5.2.13

Il y a une faute de frappe de configuration interne dans @5.2.16 qui fait réapparaître l'avis d'obsolescence pour createIndexes lorsque vous appelez explicitement createIndexes. RP ouvert☝️

(nœud : 6455) Avertissement de dépréciation : GridStore est déprécié et sera supprimé dans une future version. Veuillez utiliser GridFSBucket à la place. Et ça ??.
"gridfs-stream": "^1.1.1",
"mangouste": "^5.3.1",
"multer": "^1.4.0",
"multer-gridfs-storage": "^3.0.0"

@venkyyPoojari c'est un ancien, antérieur à la mangouste 5, mais mérite d'être abordé. Nous allons corriger.

Merci, je vais l'utiliser pour la production, alors s'il vous plaît aider dès que possible

Merci, je vais l'utiliser pour la production, alors s'il vous plaît aider dès que possible

J'ai le même problème, je dirige le readstream vers l'objet res, est-ce ce qui ne va pas? Je veux dire, cela empêche-t-il la lecture des fichiers ?

@venkyyPoojari @romain10009 c'est parce que gridfs-stream est obsolète. Le pilote MongoDB a une nouvelle API de streaming pour GridFS que vous devriez utiliser à la place : https://thecodebarbarian.com/mongodb-gridfs-stream

Cette page vous a été utile?
0 / 5 - 0 notes