Mongoose: mongodbからの非推奨の収集メソッド

作成日 2018年08月17日  ·  28コメント  ·  ソース: Automattic/mongoose

機能をリクエストしますか、それともバグを報告しますか?

バグ

現在の動作は何ですか?

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

最も参考になるコメント

こっちも一緒。 また、「検索オプション[フィールド]は非推奨であり、今後のバージョンで削除される予定です」というメッセージが表示されます。

全てのコメント28件

こっちも一緒。 また、「検索オプション[フィールド]は非推奨であり、今後のバージョンで削除される予定です」というメッセージが表示されます。

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

警告:適切なテストを行わずに本番環境でこのオプションを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つの主な問題は、クエリオプションのfieldsprojectionsに置き換えること(少なくともサーバーバージョン3.0.15に戻る)と潜在的に変更することだと思います@Fongerによって記述されたデフォルト値のuseFindAndModify 、1つの補遺:

ネイティブドライバーのfindOneAndUpdateは、3.2より前のサーバーに接続しているときに、内部で(非推奨の警告なしに)findAndModifyを呼び出すため、mongooseのfindOneAndUpdateは、3.2より前のmongodbおよびuseFindAndModify: falseでも機能します。この例で示されているように:

6880.js

#!/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:

次のようなネイティブドライバーだけを使用して、これを示すこともできます。

6880_native.js

#!/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();を使用した場合と同じ非推奨の警告が表示されます。

私は次のバージョンを使用しています:

  • mongodb:3.1.4
  • マングース:5.2.16

これに関するニュースはありますか?

@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は実装を強制終了せずに段階的に廃止されますか?

基本的に、コードベースを大きくする前に、すべてのfindByIdAndUpdatefindOneAndUpdateに変更するかどうかを尋ねています。

@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 }が機能していないことを示すように変更できますか?

6880.js

#!/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を使用してください。

このページは役に立ちましたか?
0 / 5 - 0 評価