機能をリクエストしますか、それともバグを報告しますか?
バグ
現在の動作は何ですか?
Model.findByIdAndUpdate()は、collection.findAndModifyを非推奨にしたmongodbに対して非推奨の警告を発行しています。 Mongodbは、代わりにfindOneAndUpdate、findOneAndReplace、またはfindOneAndDeleteを使用することをお勧めします。
collection.ensureIndexも非推奨になりました-mongodbは代わりにcreateIndexesを使用することを提案しています。
現在の動作がバグである場合は、再現する手順を提供してください。
Model.findByIdAndUpdate / findOneAndUpdateを使用してドキュメントを変更すると、これらの非推奨の警告が返されます。
期待される動作は何ですか?
非推奨の警告はありません!
node.js、mongoose、MongoDBのバージョンを教えてください。
ノードv10.8.0
mongodb v3.6.2
マングースv5.2.9
こっちも一緒。 また、「検索オプション[フィールド]は非推奨であり、今後のバージョンで削除される予定です」というメッセージが表示されます。
(node:13076) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
(node:13076) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
(node:13076) DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version.
(node:13076) DeprecationWarning: collection.update is deprecated. Use updateOne, updateMany, or bulkWrite instead.
これが私が手に入れた他のいくつかのものです
#6165に関連し、 CIテストで再現できます
useFindAndModify
をfalseに指定して、部分的な非推奨メッセージを防ぐことができます。 IMOこれはデフォルトでfalseになっているはずです。
mongoose.set('useFindAndModify', false);
ただし、 ensureIndex(es)
やupdate
などの他の非推奨のメソッドも、新しいAPIに置き換える必要があります。 このオプションをfalseに設定しても、これは修正されません。
次のメジャーリリースで、廃止されたすべてのメソッドを更新し、 useFindAndModify
オプションを削除する必要があるかもしれません。
ノート:
MongoDB 3.2+のみがfindOneAndUpdateシリーズクエリをサポートしますが、基盤となる[email protected]
ライブラリは引き続きfindAndModifyポリフィルを使用して互換性を2.6に戻します。そのため、 useFindAndModify
をデフォルトでfalseにすると、現在MongoDB3.0のサポートが実際に失われることはありません。
ただし、この互換性は、 [email protected]
(非常に昔)以降非推奨としてマークされ、警告メッセージをスローするようになると、間違いなく壊れます。
したがって、mongoose(6.x)の次のメジャーリリースでは、MongoDB 3.0のサポートが廃止され、すべての新しいAPIが採用されることをお勧めします。 さらに、 MongoDB 3.0は、半年前の2018年2月に保守終了に達しました。
何かご意見は?
それで...なぜこれが起こっているのですか? 次のマングースメジャーリリースまで待つ必要がありますか?
@lpiVasquezこれは、ドキュメントにmongoose5.xがMongoDBServer3.0をサポートすると記載されているためです。
今のところ、基盤となるAPIが引き続きこれを処理するため、新しいAPIを使用するだけで安全です。 ただし、基になるライブラリがこの動作を変更すると機能しなくなります。基になるライブラリをアップグレードするときは、十分に注意する必要があります。
私が言いたいのは、この問題を無視するのではなく、次のリリース5.3でMongoDB Server3.0のサポートを終了することです。 少なくとも5.2では壊れないでください。 ただ私の意見です。
@IpiVasquez
によって、
なんでこんなことが起こっているの?
もしかして、
mongodbがこれらのAPIを非推奨にする理由
Mongodbには、さまざまなドライバーAPIの一貫性を高めるための計画があります。 これは、mongodbcrud仕様でここに文書化されています
次のマングースメジャーリリースまで待つ必要がありますか?
semver仕様に固執する場合、APIを壊すものはすべて、 @5.3.0
のようなマイナーリリースや@5.2.10
のようなパッチリリースではなく、 @6.0.0
のようなメジャーリリースで発生するはずです。 @5.2.10
。
ネイティブドライバーの歴史を振り返ると、ドライバーのv4まで、これらのメソッドが削除されることはないと思います。
それまでの間、これまでに見た非推奨の警告のほとんどは、非推奨のメソッドを呼び出さないことで、ユーザーランドで軽減できると思います。 とにかく、これらのメソッドのほとんどはマングース@6.0.0
で削除されると思います。
マングースで後でではなく早く対処するための2つの主な問題は、クエリオプションのfields
をprojections
に置き換えること(少なくともサーバーバージョン3.0.15に戻る)と潜在的に変更することだと思います@Fongerによって記述されたデフォルト値のuseFindAndModify
、1つの補遺:
ネイティブドライバーのfindOneAndUpdateは、3.2より前のサーバーに接続しているときに、内部で(非推奨の警告なしに)findAndModifyを呼び出すため、mongooseのfindOneAndUpdate
は、3.2より前のmongodbおよびuseFindAndModify: false
でも機能します。この例で示されているように:
#!/usr/bin/env node
'use strict';
const mongoose = require('mongoose');
mongoose.set('useFindAndModify', false);
const url = 'mongodb://localhost:27017/test';
const opts = { useNewUrlParser: true };
mongoose.connect(url, opts);
const conn = mongoose.connection;
const Schema = mongoose.Schema;
const schema = new Schema({
name: String
});
const Test = mongoose.model('test', schema);
async function run() {
await conn.dropDatabase();
let admin = conn.db.admin();
let { version } = await admin.serverInfo();
console.log(`mongodb: ${version}`);
console.log(`mongoose: ${mongoose.version}`);
let cond = {};
let update = { name: 'Sarah' };
let opts = {
upsert: true,
new: true
};
let sarah = await Test.findOneAndUpdate(cond, update, opts);
console.log(sarah);
return conn.close();
}
run();
issues: ./6880.js
mongodb: 3.0.15
mongoose: 5.2.9
{ _id: 5b779ca8d1326ce227b6869f, __v: 0, name: 'Sarah' }
issues:
次のようなネイティブドライバーだけを使用して、これを示すこともできます。
#!/usr/bin/env node
'use strict';
const { MongoClient, Logger } = require('mongodb');
const uri = 'mongodb://localhost:27017/test';
const opts = {
useNewUrlParser: true
};
async function run() {
const client = new MongoClient(uri, opts);
await client.connect();
const db = client.db('gh-6881');
await db.dropDatabase().catch(handleError);
Logger.setLevel('debug');
let res = await db
.collection('tests')
.findOneAndUpdate({}, { $set: { name: 'michael' } }, { upsert: true })
.catch(handleError);
Logger.setLevel('error');
console.log(res);
let doc = await db
.collection('tests')
.findOne({})
.catch(handleError);
console.log(doc);
process.exit(0);
}
run();
function handleError(e) {
return console.error(e.message);
}
...
message: 'executing command [{"ns":"gh-6881.$cmd","cmd":{"findAndModify":"tests","query":{},"new":false,"remove":false,"upsert":true,"update":{"$set":{"name":"michael"}}},"options":{}}] against localhost:27017',
...
{ value: null,
lastErrorObject:
{ updatedExisting: false,
n: 1,
upserted: 5b77a23cd1326ce227b686a1 },
ok: 1 }
{ _id: 5b77a23cd1326ce227b686a1, name: 'michael' }
こっちも一緒。 アプリケーションの開始時に次の警告が表示されました。
(node:9856) DeprecationWarning: collection.findAndModify is deprecated. Use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead.
(node:9856) DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version.
(node:9856) DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version.
非推奨の警告が煩わしい場合は、_一時的な_回避策として、 --no-deprecation
を使用してCLIでnode.jsプロセスを開始し、警告を抑制することができます。 ただし、そうすることは_お勧めしません_。
私と一緒に:
(node:1) DeprecationWarning: collection.findAndModify is deprecated. Use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead.
(node:1) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
(node:1) DeprecationWarning: collection.update is deprecated. Use updateOne, updateMany, or bulkWrite instead.
(node:1) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
(node:1) DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version.
(node:1) DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version.
package-lock.jsonがこれまで以上に大好きです...
これらの非推奨の警告を回避するには、いくつかの回避策があります。
1)Re: findOneAndUpdate()
およびfindAndModify()
の非推奨、 mongoose.set('useFindAndModify', false);
を使用
2)Re: remove()
の廃止、1つのドキュメントのみを削除するかどうかに応じて、 deleteOne()
またはdeleteMany()
の使用に切り替えます
3)Re: update()
の廃止、 updateMany()
に置き換え
人々がこれらの非推奨の警告をクリーンアップするのを助けるためにいくつかのドキュメントを追加し、マングースがこれらの非推奨の警告の1つを引き起こさないようにいくつかの内部変更を行います。
たぶん、次のメジャーリリースですべての非推奨のメソッドを更新し、useFindAndModifyオプションを削除する必要がありますか?
私はこれに賛成です👍
マングースはすでに新しいメソッド、 deleteOne()
、 deleteMany()
、 updateMany()
などをサポートしていますか?
+1
同じ警告。 新しいドライバーを待つ必要があります。
だから、今、私たちはそれらの警告を無視しなければなりませんか? つまり、APIを作成しようとしているのですが、dbからすべてを取得する必要があり、collection.find()。then().... etcを呼び出すたびに同じ警告が表示されます。 そのfind()メソッドを置き換えるにはどうすればよいですか?
警告に悩まされている場合は、Nodeで非推奨の通知を無効にするか(上記のFongerのコメントを参照)、古いバージョンのMongooseに戻すことができます。
だから私は何をする必要がありますか?
検索クエリを実行するたびに、マングースからこの警告メッセージが表示されます。 マングースチームからの次の更新後までそれを無視するつもりです。
(node:15500)DeprecationWarning:collection.findオプション[fields]は非推奨であり、今後のバージョンで削除される予定です。
fields
の非推奨警告の修正は、5.2.10にあり、表示されなくなります。 他の非推奨の警告をクリーンアップするには、次のコメントの指示に従ってください: https ://github.com/Automattic/mongoose/issues/6922#issue -354147871
このドキュメントを作成していただきありがとうございますhttps://mongoosejs.com/docs/deprecations.html
Re: findOneAndUpdate()
およびfindAndModify()
の非推奨、現在の( 5.2.17
)回避策は次のように設定することだけです。
mongoose.set('useFindAndModify', false);
本当?
Model.findByIdAndUpdate()
とModel.findOneAndUpdate()
を使用しています
私は、mongooseによって使用されている基礎となるmongo dbドライバー関数は、ある時点で更新される/更新される必要があると想定しています。
私は正しいでしょうか?
+1 Model.findByIdAndUpdate();を使用した場合と同じ非推奨の警告が表示されます。
私は次のバージョンを使用しています:
これに関するニュースはありますか?
@gianpajはいmongoose.set('useFindAndModify', false)
は、findAndModify非推奨警告の現在の唯一の回避策です。 私の推測では、 collection.findAndModify()
への基になる呼び出しは[email protected]でなくなります。 @ vkarpov15それは正しいと思いますか? または、時間枠にコミットするには時期尚早ですか?
@daniyalawanは、ここのドキュメントを確認してください。コードでfindOneAndUpdate
を呼び出すと、「useFindAndModify」オプションが適用されます(これは、内部でfindOneAndUpdateを呼び出すため、findByIdAndUpdateに拡張されます)。
@Sastidar [email protected]にアップグレードした後、どのような問題が発生していますか? すべての非推奨の警告は、これらのドキュメントで対処する必要があります
@lineus @gianpajうん、useFindAndModifyオプションの必要性は、Mongoose6.0.0でなくなります。 Mongoose6をリリースする時期はありません。
非推奨の警告について-マングースはfindByIdAndUpdate
メソッドを使用する機能を段階的に廃止しますか、それとも基盤となるfindAndModify
は実装を強制終了せずに段階的に廃止されますか?
基本的に、コードベースを大きくする前に、すべてのfindByIdAndUpdate
をfindOneAndUpdate
に変更するかどうかを尋ねています。
@gianpajはい
mongoose.set('useFindAndModify', false)
は、findAndModify非推奨警告の現在の唯一の回避策です。 私の推測では、collection.findAndModify()
への基になる呼び出しは[email protected]でなくなります。 @ vkarpov15それは正しいと思いますか? または、時間枠にコミットするには時期尚早ですか?@daniyalawanは、ここのドキュメントを確認してください。コードで
findOneAndUpdate
を呼び出すと、「useFindAndModify」オプションが適用されます(これは、内部でfindOneAndUpdateを呼び出すため、findByIdAndUpdateに拡張されます)。@Sastidar [email protected]にアップグレードした後、どのような問題が発生していますか? すべての非推奨の警告は、これらのドキュメントで対処する必要があります
$#$ mongoose.set('useFindAndModify', false)
を使用すると、 {new: true}
は機能しません。 他のオプションはありますか?
@ anks333次の例は私のために働きます。 { new: true }
が機能していないことを示すように変更できますか?
#!/usr/bin/env node
'use strict';
const assert = require('assert');
const mongoose = require('mongoose');
mongoose.set('useFindAndModify', false);
const { Schema, connection} = mongoose;
const DB = '6880';
const URI = `mongodb://localhost:27017/${DB}`;
const OPTS = { family: 4, useNewUrlParser: true };
const schema = new Schema({
name: String
});
const Test = mongoose.model('test', schema);
const test = new Test({ name: 'test1' });
async function run() {
await mongoose.connect(URI, OPTS);
await connection.dropDatabase();
const doc = await Test.create(test);
assert.ok(doc);
const cond = {};
const update = { name: 'test2' };
const options = { new: true };
const updated = await Test.findOneAndUpdate(cond, update, options);
assert.strictEqual(updated.name, 'test2');
console.log('All Assertions Pass.');
await connection.close();
}
run();
issues: ./6880.js
All Assertions Pass.
issues:
@LBWright findByIdAndUpdateのサポートを終了するつもりはありません。APIを壊さずに、基盤となるfindAndModifyを交換するだけです。
(node:10767)DeprecationWarning:collection.ensureIndexは非推奨になりました。 代わりにcreateIndexesを使用してください。
@jonaspereirar https://mongoosejs.com/docs/deprecations.html
最も参考になるコメント
こっちも一緒。 また、「検索オプション[フィールド]は非推奨であり、今後のバージョンで削除される予定です」というメッセージが表示されます。