Mongoose: Docs-Seite zum Beheben von Warnungen zu veralteten Versionen

Erstellt am 27. Aug. 2018  ·  31Kommentare  ·  Quelle: Automattic/mongoose

Nach #6917 sollte es nun möglich sein, alle veralteten Warnungen wie folgt zu löschen:

  • Ersetzen von update() durch updateOne() , updateMany() oder replaceOne()
  • Ersetzen von remove() durch deleteOne() oder deleteMany()
  • Einstellung von mongoose.set('useFindAndModify', false);
  • Einstellung von mongoose.set('useCreateIndex', true);
  • Einstellung von mongoose.set('useNewUrlParser', true);

Benötigen Sie eine Dokumentseite, um dies zusammenzufassen.

docs

Hilfreichster Kommentar

Ich glaube, es ist mongoose.set('useCreateIndex', true)

Alle 31 Kommentare

Wenn diese gesetzt sind, wäre sie mit dem aktuellen Programm inkompatibel oder bricht es?

@isLishude die einzigen Unterschiede, die uns bekannt sind, sind:

1) Unterstützung für MongoDB 3.0.x
2) updateOne() und updateMany() unterstützen die Option overwrite . Wenn Sie update(filter, update, { overwrite: true }) , sollten Sie replaceOne(filter, update) , nicht updateOne(filter, update, { overwrite: true })

Wenn Sie auf andere Probleme stoßen, zögern Sie bitte nicht, ein GitHub-Problem zu eröffnen.

Ich setze mongoose.set('useCreateIndexes', true) und bekomme immer noch DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead .

Ich habe es vor und nach mongoose.connect() ausprobiert.

@ulrichb Sind Sie sicher , dass Sie verwenden [email protected] , dass vor einer Stunde veröffentlicht?

Ich kann replizieren, was @ulrichb am 5.2.10 sieht mit:

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();

Ausgabe:

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

Ich glaube, es ist mongoose.set('useCreateIndex', true)

den ursprünglichen Kommentar aktualisiert, um die Beobachtung von @saagar2000 widerzuspiegeln. Danke @saagar2000 !

@vkarpov15 ist es möglich, die Dokumentmethode remove in delete umzubenennen, um ebenfalls konsistent zu sein? (Oder einen Alias ​​angeben)?

Derzeit refaktoriere ich die gesamte modellbasierte Verwendung von remove in deleteOne und deleteMany , aber die Dokumentmethoden heißen immer noch remove() (was auch nicht mit die isDeleted() Methode).

Z.B

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

Ich sehe die Warnung collection.{remove|update} is deprecated bei Document.{remove|update} Operationen.

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

@adamreisnz ja, wir sollten einen Alias doc.delete() hinzufügen, dito für doc.update() @mycompassspins

mongoose.set('useCreateIndex', true) hat für mich keine Auswirkung. 😞
immer noch die 'DeprecationWarning: collection.ensureIndex ist veraltet. Verwenden Sie stattdessen createIndexes.'

@ParikshitChavan Haben Sie diese Option eingestellt, bevor Sie mongoose.model() aufgerufen haben?

Verwendung von Mungos 5.2.12. Ich bekomme auch Folgendes: the options [useCreateIndex] is not supported zusätzlich zur Veraltungswarnung.

Weitere Informationen: Ich erhalte diese zusätzliche Nachricht nur, wenn useCreateIndex als Verbindungsoption übergeben wird. Wenn ich mongoose.set() verwende, bekomme ich diese Meldung nicht.

Es sieht so aus, als ob es richtig funktionieren sollte, wenn es als Verbindungsoption übergeben wird, aber es funktioniert nicht. erst nach explizitem mongoose.set()

@Fonger @govindrai
Ich habe versucht, dies über die Verbindungsoptionen zu tun und obwohl mongoose.set()
vor und nach Anbindung an die DB.
die 'DeprecationWarning: collection.ensureIndex ist veraltet. Verwenden Sie stattdessen createIndexes.' scheint immer zu bestehen.

Auch hier, kann collection.ensureIndex is deprecated Warnung nicht loswerden... Egal ob set oder als Option...

@ParikshitChavan @govindrai @Avcajaraville

Sie müssen mongoose.set('useCreateIndex', true) vor JEDEM mongoose.model() Anruf eingeben
(Hinweis: nicht mongoose.connect() ).

Siehe die Diskussion in #6890. Dies ist in 5.2.13 behoben (aber noch nicht veröffentlicht).

@Fonger @vkarpov15 Nach dem Upgrade auf 5.2.13 besteht das Problem weiterhin

(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"
    },

Knoten- und NPM-Info:

$ node -v
v10.6.0

$ npm -v
6.4.1

@arastu können Sie ein reproduzierbares Beispiel mit einer oder mehreren Dateien erstellen, in dem Sie demonstrieren, dass Sie 5.2.13 verwenden und eine oder mehrere dieser Warnungen sehen?

Beachten Sie, dass ich mongoose.set() anrufe, bevor ich meine Modelle benötige

Zum Beispiel:

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();

ein.js

'use strict';

const mongoose = require('mongoose');

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

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

zwei.js

'use strict';

const mongoose = require('mongoose');

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

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

Ausgabe:

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

für mich arbeiten in 5.2.13. @lineus wird useCreateIndex als Verbindungsoption unterstützt? Bekomme derzeit the options [useCreateIndex] is not supported

dh
mongoose.connect( process.env.MONGODB_URI, { useNewUrlParser: true, autoIndex: false, useCreateIndex: true, } )

@govindrai im Moment sollten Sie mongoose.set('useCreateIndex', true) wie in den Warnungsdokumenten zur Veraltung angegeben

Ich habe ein Upgrade auf 5.2.14 und sehe immer noch Warnungen zu veralteten Versionen, die keinen Sinn ergeben. Zum Beispiel collection.update is deprecated . . . wenn ich tatsächlich document.update . Dasselbe gilt für die Methode remove des Modells und des Dokuments. Der Wechsel zu document.updateOne erzeugt TypeError: document.updateOne is not a function . Übersehe ich hier etwas?

@mycompassspins Haben Sie den Stapel verfolgt, der die Warnung erzeugt hat?

Zum Beispiel stellte sich in meinem Fall heraus, dass die Veraltungswarnung aufgrund von connect mongo aufgetreten ist .

Wenn Sie die obigen Anweisungen befolgen, sind, zumindest für mich, alle Warnungen zur Einstellung verschwunden :)

Hier ist der Stapel:

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)

Offensichtlich wird Model.update tatsächlich ausgeführt, obwohl ich MongooseDocument.update . Das mache ich mehr oder weniger:

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 bist du sicher, dass du am 5.2.14 bist? Wir haben doc.updateOne(update) in 5.2.13 hinzugefügt

Es gibt einen internen Konfigurationsfehler in @5.2.16 , der dazu führt, dass der Hinweis auf veraltete Dateien für createIndexes wieder auftaucht, wenn Sie createIndexes explizit aufrufen. PR geöffnet☝️

(node:6455) DeprecationWarning: GridStore ist veraltet und wird in einer zukünftigen Version entfernt. Bitte verwenden Sie stattdessen GridFSBucket. Was ist damit??.
"gridfs-stream": "^1.1.1",
"Mungo": "^5.3.1",
"multer": "^1.4.0",
"multer-gridfs-storage": "^3.0.0"

@venkyyPoojari das ist ein altes, älter als Mungo 5, aber es lohnt sich, es anzusprechen. Wir werden reparieren.

Danke, ich werde das für die Produktion verwenden, also bitte helft so schnell wie möglich

Danke, ich werde das für die Produktion verwenden, also bitte helft so schnell wie möglich

Ich habe das gleiche Problem, ich leite den Readstream an das res-Objekt, ist das falsch? Ich meine, verhindert es, dass die Dateien ausgelesen werden?

@venkyyPoojari @romain10009 Das liegt daran, dass gridfs-stream veraltet ist. Der MongoDB-Treiber hat eine neue Streaming-API für GridFS, die Sie stattdessen verwenden sollten: https://thecodebarbarian.com/mongodb-gridfs-stream

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen