Mongoose: طرق الجمع الموقوفة من mongodb

تم إنشاؤها على ١٧ أغسطس ٢٠١٨  ·  28تعليقات  ·  مصدر: Automattic/mongoose

هل تريد طلب ميزة أو الإبلاغ عن خطأ ؟

خلل برمجي

ما هو السلوك الحالي؟

يُصدر Model.findByIdAndUpdate () تحذيرًا بشأن الإيقاف لـ mongodb - الذي قام بإهمال collection.findAndModify. يقترح 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 يجب أن يكون هذا افتراضيًا إلى خطأ الآن.

mongoose.set('useFindAndModify', false);

تحذير: لا تضبط هذا الخيار على خطأ في الإنتاج بدون الاختبار المناسب

ومع ذلك ، لا تزال هناك طرق أخرى مهملة مثل ensureIndex(es) و update بحاجة إلى استبدالها بواجهة برمجة تطبيقات جديدة أيضًا. لن يؤدي تعيين هذا الخيار على "خطأ" إلى إصلاح ذلك.
ربما نحتاج إلى تحديث جميع الطرق المتوقفة وإزالة خيارات useFindAndModify في الإصدار الرئيسي التالي؟

ملحوظة:
فقط MongoDB 3.2+ يدعم استعلام سلسلة findOneAndUpdate ولكن المكتبة الأساسية [email protected] لا تزال تستخدم findAndModify polyfill للحفاظ على التوافق مرة أخرى إلى 2.6 لذا فإن جعل useFindAndModify افتراضيًا إلى false لن يؤدي في الواقع إلى إسقاط دعم MongoDB 3.0 حاليًا.

ومع ذلك ، فإن هذا التوافق سينقطع بالتأكيد قريبًا حيث تم وضع علامة عليها على أنها مهملة منذ [email protected] (منذ وقت طويل جدًا) وحتى الآن تلقي رسائل تحذير.

ومن ثم ، أقترح أن يؤدي الإصدار الرئيسي التالي من النمس (6.x) إلى إيقاف دعم MongoDB 3.0 واعتماد واجهة برمجة التطبيقات الجديدة بالكامل. علاوة على ذلك ، وصل برنامج MongoDB 3.0 إلى نهاية العمر في فبراير 2018 ، قبل نصف عام.

أي أفكار؟

إذن ... لماذا يحدث هذا؟ هل من الضروري الانتظار حتى الإصدار الرئيسي التالي من النمس؟

lpiVasquez لأن المستند يقول mongoose 5.x يدعم MongoDB Server 3.0 .

في الوقت الحالي ، من الآمن استخدام واجهة برمجة التطبيقات الجديدة فقط لأن واجهة برمجة التطبيقات الأساسية لا تزال تتعامل مع هذا الأمر بالنسبة لنا. ومع ذلك ، فإنها لن تعمل بمجرد أن تغير المكتبة الأساسية هذا السلوك ونحن بحاجة إلى توخي الحذر الشديد عند ترقية المكتبة الأساسية.

ما أعنيه هو عدم تجاهل المشكلة ولكن إسقاط الدعم لـ MongoDB Server 3.0 في الإصدار التالي 5.3. على الأقل لا تكسر 5.2. فقط رأيي بالرغم من ذلك.

تضمين التغريدة

إذا كان ،

لماذا يحدث هذا؟

أنت تعني،

لماذا تقوم mongodb بإهمال واجهات برمجة التطبيقات هذه

لدى Mongodb خطة لجعل العديد من واجهات برمجة تطبيقات السائق أكثر اتساقًا. تم توثيق هذا هنا في مواصفات الخام mongodb

هل من الضروري الانتظار حتى الإصدار الرئيسي التالي من النمس؟

إذا التزمنا بمواصفات semver ، فيجب أن يحدث أي شيء يكسر API في إصدار رئيسي ، مثل @6.0.0 بدلاً من إصدار ثانوي مثل @5.3.0 أو إصدار تصحيح مثل @5.2.10 .

بالنظر إلى تاريخ برنامج التشغيل الأصلي ، لا أتوقع منهم إزالة هذه الأساليب حتى الإصدار 4 من برنامج التشغيل.

في غضون ذلك ، أعتقد أن معظم تحذيرات الإيقاف التي رأيتها حتى الآن يمكن تخفيفها في userland من خلال عدم استدعاء الأساليب المهملة. أعتقد أن معظم هذه الطرق ستتم إزالتها في النمس @6.0.0 أي حال.

أعتقد أن المسألتين الرئيسيتين اللتين يتعين علينا التعامل معهما في النمس عاجلاً وليس آجلاً هما استبدال projections مقابل fields في خيارات الاستعلام (يعمل مرة أخرى على إصدار الخادم 3.0.15 على الأقل) ومن المحتمل أن يتغير القيمة الافتراضية هي useFindAndModify كما هو موضح بواسطة Fonger ، مع ملحق واحد:

سوف تستدعي findOneAndUpdate في برنامج التشغيل الأصلي findAndModify من أجلك داخليًا (بدون تحذير الإيقاف) عندما تكون متصلاً بخادم سابق 3.2 ، لذلك لا يزال mongoose findOneAndUpdate يعمل مع mongodb قبل 3.2 و 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.

إذا وجدت تحذير الإهمال مزعجًا ، كحل بديل مؤقت ، يمكنك بدء عملية node.js في cli باستخدام --no-deprecation لمنع التحذير. إنه _ لا يوصى به_ القيام بذلك بالرغم من ذلك.

معي:

 (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() ، قم بالتبديل إلى استخدام deleteOne() أو deleteMany() اعتمادًا على ما إذا كنت تريد حذف مستند واحد فقط
3) Re: الإهمال update() ، استبدل بـ updateMany()

سنضيف بعض المستندات لمساعدة الأشخاص في إزالة تحذيرات الإيقاف هذه ، وإجراء بعض التغييرات الداخلية حتى لا يتسبب النمس في أحد تحذيرات الإيقاف هذه.

ربما نحتاج إلى تحديث جميع الطرق المهملة وإزالة خيارات useFindAndModify في الإصدار الرئيسي التالي؟

سأكون مع هذا 👍

هل يدعم النمس بالفعل الطرق الجديدة ، deleteOne() ، deleteMany() ، updateMany() إلخ؟

+1
نفس التحذير. نحن بحاجة إلى انتظار سائق جديد.

مثل ، الآن علينا تجاهل تلك التحذيرات؟ أعني أنني أحاول إنشاء واجهة برمجة تطبيقات ، حيث أحتاج إلى الحصول على كل شيء من ديسيبل ومتى اتصلت ب collection.find (). ثم () .... إلخ ، فهذا يعطيني نفس التحذير. ماذا يمكنني أن أفعل لاستبدال طريقة البحث ()؟

إذا كنت منزعجًا من التحذيرات ، يمكنك على الأرجح تعطيل إشعارات الإيقاف في Node (انظر تعليق Fonger أعلاه) ، أو يمكنك العودة إلى إصدار أقدم من Mongoose.

إذن ماذا علي أن أفعل؟

تلقيت رسالة التحذير هذه من النمس في كل مرة أقوم فيها بتشغيل استعلام بحث. سوف نتجاهلها إلى ما بعد التحديث التالي من فريق النمس.

(العقدة: 15500) DeprecationWarning: collection.find خيار [الحقول] مهمل وستتم إزالته في إصدار لاحق.

سيكون إصلاح تحذير الإيقاف fields في 5.2.10 ، ولن تراه بعد الآن. لتنظيف تحذيرات الإهمال الأخرى ، اتبع التعليمات الواردة في هذا التعليق: https://github.com/Automattic/mongoose/issues/6922#issue -354147871

شكرًا لك على كتابة هذا المستند https://mongoosejs.com/docs/deprecations.html

رد: findOneAndUpdate() و findAndModify() الإهمال ، الحل الوحيد الحالي ( 5.2.17 ) هو تعيين:

mongoose.set('useFindAndModify', false);

هل هذا صحيح؟

أنا أستخدم Model.findByIdAndUpdate() و Model.findOneAndUpdate()

أفترض أن وظائف برنامج التشغيل mongo db الأساسية التي يستخدمها النمس سيتم / يجب تحديثها في مرحلة ما.
هل سأكون على حق؟

+1 لدي نفس تحذير الإهمال لاستخدام Model.findByIdAndUpdate () ؛

أنا أستخدم المراجع التالية:

  • منجودب: 3.1.4
  • النمس: 5.2.16

أي أخبار عن هذا؟

gianpaj yes mongoose.set('useFindAndModify', false) هو الحل الحالي الوحيد لتحذير الإيقاف findAndModify. أعتقد أن المكالمة الأساسية لـ collection.findAndModify() ستختفي في [email protected]. @ vkarpov15 هل هذا الصوت عن الحق؟ أم أنه من السابق لأوانه الالتزام بإطار زمني؟

daniyalawan تحقق من المستندات هنا ، ينطبق خيار "useFindAndModify" عليك إذا اتصلت بـ findOneAndUpdate في الكود الخاص بك (يمتد هذا إلى findByIdAndUpdate لأنه يستدعي findOneAndUpdate داخليًا).

Sastidar ما هي المشكلة (المشكلات) التي تواجهك بعد الترقية إلى [email protected]؟ يجب تناول جميع تحذيرات الإيقاف في هذه المستندات

lineusgianpaj نعم ، ستختفي الحاجة إلى خيار useFindAndModify مع Mongoose 6.0.0. لا يوجد إطار زمني لموعد إطلاق سراح النمس 6.

بخصوص تحذير الإيقاف - هل سيتخلص النمس تدريجيًا من القدرة على استخدام طريقة findByIdAndUpdate أم سيتم التخلص التدريجي من findAndModify الأساسي دون إنهاء التنفيذ؟

أنا أسأل بشكل أساسي عما إذا كنت قد غيرت كل ما لدي من findByIdAndUpdate إلى findOneAndUpdate قبل أن يكون لدي قاعدة بيانات أكبر.

gianpaj yes mongoose.set('useFindAndModify', false) هو الحل الحالي الوحيد لتحذير الإيقاف findAndModify. أعتقد أن المكالمة الأساسية لـ collection.findAndModify() ستختفي في [email protected]. @ vkarpov15 هل هذا الصوت عن الحق؟ أم أنه من السابق لأوانه الالتزام بإطار زمني؟

daniyalawan تحقق من المستندات هنا ينطبق خيار "useFindAndModify" عليك إذا اتصلت بـ findOneAndUpdate في الكود الخاص بك (يمتد هذا إلى findByIdAndUpdate لأنه يستدعي findOneAndUpdate داخليًا).

Sastidar ما هي المشكلة (المشكلات) التي تواجهك بعد الترقية إلى [email protected]؟ يجب تناول جميع تحذيرات الإيقاف في هذه المستندات

لن يعمل {new: true} إذا استخدمت mongoose.set('useFindAndModify', false) . أي خيار آخر؟

@ 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 ، سنقوم فقط بتبديل البحث الأساسي وتعديله دون كسر واجهة برمجة التطبيقات

(العقدة: 10767) تحذير الإيقاف: تم إهمال collection.ensureIndex. استخدم createIndexes بدلاً من ذلك.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات