Mongoose: Metode pengumpulan usang dari mongodb

Dibuat pada 17 Agu 2018  ·  28Komentar  ·  Sumber: Automattic/mongoose

Apakah Anda ingin meminta fitur atau melaporkan bug ?

Serangga

Apa perilaku saat ini?

Model.findByIdAndUpdate() mengeluarkan peringatan penghentian untuk mongodb - yang tidak lagi menggunakan collection.findAndModify. Mongodb menyarankan menggunakan findOneAndUpdate, findOneAndReplace atau findOneAndDelete sebagai gantinya.

collection.ensureIndex juga tidak digunakan lagi - mongodb menyarankan untuk menggunakan createIndexes sebagai gantinya.

Jika perilaku saat ini adalah bug, berikan langkah-langkah untuk mereproduksi.

Menggunakan Model.findByIdAndUpdate / findOneAndUpdate untuk mengubah dokumen mengembalikan peringatan penghentian ini.

Apa perilaku yang diharapkan?

Tidak ada peringatan penghentian!

Sebutkan versi node.js, luwak, dan MongoDB Anda.

Simpul v10.8.0
mongodb v3.6.2
luwak v5.2.9

Komentar yang paling membantu

Sama disini. Saya juga mendapatkan "pilihan temukan [bidang] tidak digunakan lagi dan akan dihapus di versi yang lebih baru."

Semua 28 komentar

Sama disini. Saya juga mendapatkan "pilihan temukan [bidang] tidak digunakan lagi dan akan dihapus di versi yang lebih baru."

(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.

Ini beberapa yang lain yang saya dapatkan

Terkait dengan #6165 dan dapat direproduksi pada tes CI

Anda dapat menentukan useFindAndModify ke false untuk mencegah pesan penghentian sebagian. IMO ini harus default ke false sekarang.

mongoose.set('useFindAndModify', false);

Peringatan: Jangan setel opsi ini ke false dalam produksi tanpa pengujian yang tepat

Namun, metode usang lainnya seperti ensureIndex(es) dan update masih perlu diganti dengan API baru juga. Menyetel opsi ini ke false tidak akan memperbaikinya.
Mungkin kita perlu memperbarui semua metode usang dan menghapus opsi useFindAndModify di rilis besar berikutnya?

Catatan:
Hanya MongoDB 3.2+ yang mendukung kueri seri findOneAndUpdate tetapi pustaka [email protected] yang mendasarinya masih menggunakan polyfill findAndModify untuk tetap kompatibilitas kembali ke 2.6 sehingga membuat useFindAndModify default ke false tidak akan benar-benar menghentikan dukungan untuk MongoDB 3.0 saat ini.

Namun kompatibilitas ini pasti akan segera rusak karena telah ditandai sebagai usang sejak [email protected] (sudah lama sekali) dan sekarang bahkan memberikan pesan peringatan.

Oleh karena itu, saya menyarankan rilis besar berikutnya dari luwak (6.x) menghentikan dukungan MongoDB 3.0 dan mengadopsi semua API baru. Selanjutnya, MongoDB 3.0 telah mencapai End-of-life pada Februari 2018, setengah tahun yang lalu.

Ada pikiran?

Jadi mengapa hal ini terjadi? Apakah perlu menunggu sampai rilis utama luwak berikutnya?

@lpiVasquez itu karena dokumen mengatakan luwak 5.x mendukung MongoDB Server 3.0 .

Untuk saat ini aman untuk menggunakan API baru saja karena API yang mendasarinya masih menangani ini untuk kami. Namun itu tidak akan berfungsi setelah pustaka yang mendasari mengubah perilaku ini dan kami harus sangat berhati-hati saat memutakhirkan pustaka yang mendasarinya.

Maksud saya bukan mengabaikan masalah tetapi menjatuhkan dukungan untuk MongoDB Server 3.0 di rilis 5.3 berikutnya. Setidaknya jangan rusak di 5.2. Hanya pendapat saya sekalipun.

@IpiVasquez

jika oleh,

mengapa ini terjadi?

maksud Anda,

mengapa mongodb menghentikan API ini?

Mongodb memiliki rencana untuk membuat berbagai API driver lebih konsisten. Ini didokumentasikan di sini di spesifikasi mentah mongodb

Apakah perlu menunggu sampai rilis utama luwak berikutnya?

Jika kita tetap pada semver spec , maka apa pun yang merusak API akan terjadi dalam rilis UTAMA , seperti @6.0.0 sebagai lawan dari rilis kecil seperti @5.3.0 atau rilis patch seperti @5.2.10 .

Melihat kembali sejarah driver asli, saya tidak mengharapkan mereka untuk menghapus metode ini sampai v4 driver.

Sementara itu, saya pikir sebagian besar peringatan penghentian yang saya lihat sejauh ini dapat dikurangi di userland dengan tidak memanggil metode yang sudah usang. Saya kira sebagian besar metode ini akan dihapus di luwak @6.0.0 .

Saya pikir 2 masalah utama yang harus kita tangani di luwak lebih cepat daripada nanti adalah mengganti projections untuk fields dalam opsi kueri ( berfungsi kembali ke setidaknya server versi 3.0.15 ) dan berpotensi berubah nilai default useFindAndModify seperti yang dijelaskan oleh @Fonger , dengan satu tambahan:

findOneAndUpdate di driver asli akan memanggil findAndModify untuk Anda secara internal ( tanpa peringatan penghentian ) ketika Anda terhubung ke server sebelum 3.2, jadi findOneAndUpdate di luwak masih berfungsi dengan mongodb sebelum 3.2 dan useFindAndModify: false seperti yang ditunjukkan dalam contoh ini:

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

Keluaran:

issues: ./6880.js
mongodb: 3.0.15
mongoose: 5.2.9
{ _id: 5b779ca8d1326ce227b6869f, __v: 0, name: 'Sarah' }
issues:

Anda juga dapat mendemonstrasikan ini hanya dengan driver asli seperti ini:

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

Keluaran terpotong:

...
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' }

Sama disini. Saya mendapat peringatan ini saat aplikasi mulai:

(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.

Jika Anda menemukan peringatan penghentian mengganggu, sebagai solusi _temporary_ , Anda dapat memulai proses node.js di cli dengan --no-deprecation untuk menekan peringatan. Ini _tidak disarankan_ untuk melakukannya.

dengan milikku:

 (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.

suka package-lock.json lebih dari sebelumnya...

Ada beberapa solusi untuk mengatasi peringatan penghentian ini:

1) Re: findOneAndUpdate() dan findAndModify() penghentian, gunakan mongoose.set('useFindAndModify', false);
2) Re: remove() penghentian, beralih menggunakan deleteOne() atau deleteMany() tergantung pada apakah Anda hanya ingin menghapus satu dokumen
3) Re: update() , ganti dengan updateMany()

Kami akan menambahkan beberapa dokumen untuk membantu orang membersihkan peringatan penghentian ini, dan membuat beberapa perubahan internal sehingga luwak tidak menyebabkan salah satu dari peringatan penghentian ini.

Mungkin kita perlu memperbarui semua metode usang dan menghapus opsi useFindAndModify di rilis besar berikutnya?

Saya akan mendukung ini 👍

Apakah luwak sudah memiliki dukungan untuk metode baru, deleteOne() , deleteMany() , updateMany() dll?

+1
peringatan yang sama. kita harus menunggu driver baru.

jadi seperti, sekarang kita harus mengabaikan peringatan itu? maksud saya saya mencoba membuat api, di mana saya perlu mendapatkan semuanya dari db dan setiap kali saya memanggil collection.find().then()....etc itu memberi saya peringatan yang sama. apa yang dapat saya lakukan untuk mengganti metode find() itu?

Jika Anda hanya terganggu oleh peringatan, Anda mungkin dapat menonaktifkan pemberitahuan penghentian di Node (lihat komentar Fonger di atas), atau Anda dapat kembali ke versi lama dari Mongoose.

Jadi apa yang harus saya lakukan?

Mendapat pesan peringatan ini dari luwak setiap kali saya menjalankan kueri pencarian. Akan mengabaikannya sampai setelah pembaruan berikutnya dari tim luwak.

(node:15500) DeprecationWarning: opsi collection.find [bidang] tidak digunakan lagi dan akan dihapus di versi yang lebih baru.

Perbaikan untuk peringatan penghentian fields akan ada di 5.2.10, Anda tidak akan melihatnya lagi. Untuk membersihkan peringatan penghentian lainnya, ikuti instruksi dalam komentar ini: https://github.com/Automattic/mongoose/issues/6922#issue -354147871

Terima kasih telah menulis dokumen ini https://mongoosejs.com/docs/deprecations.html

Re: findOneAndUpdate() dan findAndModify() penghentian, satu-satunya solusi saat ini ( 5.2.17 ) adalah mengatur:

mongoose.set('useFindAndModify', false);

Benarkah?

Saya menggunakan Model.findByIdAndUpdate() dan Model.findOneAndUpdate()

Saya berasumsi fungsi driver mongo db yang mendasari yang digunakan oleh luwak akan/harus diperbarui di beberapa titik.
Apakah saya benar?

+1 Saya memiliki peringatan penghentian yang sama untuk menggunakan Model.findByIdAndUpdate();

Saya menggunakan versi berikut:

  • mongodb: 3.1.4
  • luwak: 5.2.16

Ada berita tentang ini?

@gianpaj yes mongoose.set('useFindAndModify', false) adalah satu-satunya solusi saat ini untuk peringatan penghentian findAndModify. Dugaan saya adalah bahwa panggilan yang mendasari ke collection.findAndModify() akan hilang di [email protected]. @vkarpov15 apakah itu terdengar benar? atau terlalu dini untuk berkomitmen pada kerangka waktu?

@daniyalawan periksa dokumen di sini opsi 'useFindAndModify' berlaku untuk Anda jika Anda memanggil findOneAndUpdate dalam kode Anda (ini meluas ke findByIdAndUpdate karena memanggil findOneAndUpdate secara internal ).

@Sastidar masalah apa yang Anda alami setelah memutakhirkan ke [email protected]? Semua peringatan penghentian harus ditangani dalam dokumen ini

@lineus @gianpaj ya kebutuhan untuk opsi useFindAndModify akan hilang dengan Mongoose 6.0.0. Tidak ada kerangka waktu kapan kami akan merilis Mongoose 6.

Mengenai peringatan penghentian - Apakah luwak akan menghapus secara bertahap kemampuan untuk menggunakan metode findByIdAndUpdate atau apakah findAndModify yang mendasarinya akan dihapus secara bertahap tanpa mematikan implementasi saya?

Saya pada dasarnya bertanya apakah saya mengubah semua findByIdAndUpdate saya menjadi findOneAndUpdate sebelum saya memiliki basis kode yang lebih besar.

@gianpaj yes mongoose.set('useFindAndModify', false) adalah satu-satunya solusi saat ini untuk peringatan penghentian findAndModify. Dugaan saya adalah bahwa panggilan yang mendasari ke collection.findAndModify() akan hilang di [email protected]. @vkarpov15 apakah itu terdengar benar? atau terlalu dini untuk berkomitmen pada kerangka waktu?

@daniyalawan periksa dokumen di sini opsi 'useFindAndModify' berlaku untuk Anda jika Anda memanggil findOneAndUpdate dalam kode Anda (ini meluas ke findByIdAndUpdate karena memanggil findOneAndUpdate secara internal ).

@Sastidar masalah apa yang Anda alami setelah memutakhirkan ke [email protected]? Semua peringatan penghentian harus ditangani dalam dokumen ini

{new: true} tidak akan berfungsi jika saya menggunakan mongoose.set('useFindAndModify', false) . ada pilihan lain?

@ anks333 contoh berikut berfungsi untuk saya. Bisakah Anda memodifikasinya untuk menunjukkan { new: true } tidak berfungsi?

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

Keluaran:

issues: ./6880.js
All Assertions Pass.
issues:

@LBWright kami tidak berniat menjatuhkan dukungan untuk findByIdAndUpdate, kami hanya akan menukar findAndModify yang mendasarinya tanpa merusak API

(node:10767) DeprecationWarning: collection.ensureIndex tidak digunakan lagi. Gunakan createIndexes sebagai gantinya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

ArThoX picture ArThoX  ·  3Komentar

jeneser picture jeneser  ·  3Komentar

lukasz-zak picture lukasz-zak  ·  3Komentar

Igorpollo picture Igorpollo  ·  3Komentar

adamreisnz picture adamreisnz  ·  3Komentar