Mongoose: تحذير: تم إهمال collection.ensureIndex. استخدم createIndexes بدلاً من ذلك.

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

بعد التحديث إلى الإصدار 5.2.9 أتلقى هذه الرسالة في وحدة التحكم طوال الوقت ، عندما أبدأ تطبيق الويب الخاص بي:

DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

وأنا لا أستخدم أيا منهما.

enhancement

التعليق الأكثر فائدة

بعد الترقية إلى الإصدار 5.2.10. أي من الخيارات أدناه يجب أن يوقف التحذيرات؟

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
أو
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
انها لا تعمل هنا. (آسف إذا فعلت شيئًا خاطئًا)

ال 32 كومينتر

نسخة مكررة من # 6880

نشكرك على الوقت الذي أمضيته في الإبلاغ عن المشكلةbricss. مكالمات النمس ensureIndex() داخليًا. يمكنك تجاهل التحذير بأمان في الوقت الحالي ، أو إسكاته بعلامة العقدة --no-deprecation ، أو الرجوع إلى الإصدار 5.2.8 إذا لم تكن هناك إصلاحات محددة في 5.2.9 كنت تعتمد عليها. اتبع # 6880 للحصول على التحديثات 👍

، unique: true، index: true موجود في حقل واحد بأحد المخططات الخاصة بي ويطلق هذا التحذير. اسأل عن كيفية ضمان قيمة فريدة دون تلقي هذا التحذير.

ترقية nonniv إلى 5.2.10 وقم بتعيين mongoose.set('useCreateIndex', true);

بعد الترقية إلى الإصدار 5.2.10. أي من الخيارات أدناه يجب أن يوقف التحذيرات؟

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
أو
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
انها لا تعمل هنا. (آسف إذا فعلت شيئًا خاطئًا)

samuelcecilio ما هي تحذيرات الإهمال المحددة التي تراها؟ هناك بعض الملاحظات المفيدة في التعليق الذي فتح # 6922 ، أو لا تتردد في مشاركة تحذيراتك المحددة هنا وسأرى ما إذا كان بإمكاني المساعدة.

(node:9125) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

samuelcecilio ، يجب أن يوقف mongoose.set('useCreateIndex', true) هذا التحذير كما هو موضح في هذا المثال:

6922.js

#!/usr/bin/env node
'use strict';

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
mongoose.set('useCreateIndex', 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();

انتاج:

issues: ./6922.js
mongoose version: 5.2.10
issues:

هل أنت متأكد من أن مشروعك يستخدم 5.2.10؟ هل هناك حزم أخرى في مشروعك تستخدم إصدارات أخرى من النمس ، إلخ؟

مرحبا، شكرا على الرد. نعم ، راجعت الإصدار ثلاث مرات لول:

$ npm list --depth=0 ... [email protected] ...

رمز بلدي

app.js
شبيبة
...

config config = تتطلب ('./ config')
const mongoose = تتطلب ('mongoose')
const صريحة = تتطلب ("صريحة")
تطبيق const = صريح ()

mongoose.connect (config.dbUri، {useNewUrlParser: true})
mongoose.set ('useCreateIndex' ، صحيح)

....

module.exports = app
""

بن / شبكة الاتصالات العالمية
شبيبة

! / usr / bin / env

تطبيق const = يتطلب ("../ التطبيق")
config config = تتطلب ('../ config')
تصحيح أخطاء const = تتطلب ('debug') ('blitz')
const http = تتطلب ('http')
منفذ const = normalizePort (process.env.PORT || config.port)
const mongoose = تتطلب ('mongoose')

app.set ("منفذ" ، منفذ)

خادم const = http.createServer (التطبيق)

server.listen (المنفذ)
server.on ('error'، onError)
server.on ("الاستماع" ، عند الاستماع)

const mongo = mongoose.connection. اتصال نمس

mongo.on ('error'، error => {debug ('mongo:' + error.name)})
mongo.on ('متصل'، () => {debug ('mongo: Connected')})
mongo.on ('غير متصل'، () => {debug ('mongo: Disconnected')})

....
""

عندما أقوم بتشغيل DEBUG=blitz* npm run dev

"" باش

nodemon بن / شبكة الاتصالات العالمية

[nodemon] 1.18.3
[nodemon] لإعادة التشغيل في أي وقت ، أدخل rs
[nodemon ] مشاهدة:.
[nodemon] بدءًا من node bin/www
Blitz الاستماع على المنفذ 3000 + 0ms
Blitz mongo: متصل + 14 مللي ثانية
(العقدة: 10622) تحذير الإيقاف: تم إهمال collection.ensureIndex. استخدم createIndexes بدلاً من ذلك.
""

ربما يقومsamuelcecilio بنقل mongoose.set('useCreateIndex', true) إلى الملف bin/www بدلاً من ذلك؟ سأقوم بإعداد مثال صريح واختباره أيضًا.

samuelcecilio بعد التلاعب بهذا ، وجدت أنني بحاجة إلى ضبط useCreateIndex على true في ملف المسار الذي يحتوي على النموذج. في حالتي ، بعد استخدام أداة cli السريعة ، كنت بحاجة إلى تعيين useCreateIndex في مسار الفهرس الموضح أدناه:

var express = require('express');
var router = express.Router();
const mongoose = require('mongoose');
mongoose.set('useCreateIndex', true);
const Test = mongoose.model('test', { name: {type: String, unique: true }});

/* GET home page. */
router.get('/', function(req, res, next) {
  Test.create({ name: 'billy' }).then((doc) => {
    return res.status(200).json({ done: true, test: doc.id });
  }).catch((e) => {
    return res.status(500).json({ err: e });
  });
});

module.exports = router;

بدون الخيار المحدد في مسار الفهرس الذي حصلت عليه:

[nodemon] starting `node bin/www`
version: 5.2.10
(node:17042) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

بعد تحديد الخيار في المسار الذي حصلت عليه:

[nodemon] starting `node bin/www`
version: 5.2.10
^C

حاولت وضعه في bin / www لكن ذلك لم يخلصك من التحذير. كان فقط تعيينه في المسار ناجحًا.

إخراج الشباك المضيف المحلي

~>: curl localhost:3000/
{"done":true,"test":"5b84a4e13ec72e4352475426"}~>: 
~>: 

أستخدم ملفات منفصلة للمستخدمين والعملاء والموردين والأوامر والعناصر ..

توقف هذا التحذير:

النماذج / user.js
شبيبة
const addressSchema = تتطلب ('./ العنوان')
ملف تعريف constSchema = يتطلب ('./ profile')
const uuidv4 = تتطلب ('uuid / v4')
const mongoose = تتطلب ('mongoose')
مخطط كونست = النمس

mongoose.set ('useCreateIndex' ، صحيح)

const userSchema = مخطط جديد ({
معطل: {type: Boolean، default: false}،
الأدوار: {type: Array، default: ['assistant']}،
الهوية: {type: String، unique: true، required: true}،
اسم المستخدم: {type: String، unique: true، required: true}،
الاسم: {type: String، uppercase: true، required: true}،
كلمة المرور: {type: String، required: true}،
السر: سلسلة ،
الملف الشخصي: profileSchema ،
العنوان: addressSchema،
تاريخ الإنشاء،
تاريخ معدل
} ، {
المجموعة: "المستخدمون"
})

userSchema.pre ("حفظ" ، الوظيفة (التالية) {
const doc = this
doc.created = Date.now ()
doc.modified = Date.now ()
doc.secret = uuidv4 ()
التالي()
})

module.exports = mongoose.model ('User'، userSchema)

""

كنت أحسب أنه سيكون بعض الإعدادات العامة ، ولكن من الواضح أنني يجب أن أضيف في جميع الملفات.

samuelcecilio يمكنك لف النمس في ملف مخصص ، شيء من هذا القبيل

myMongoose.js

const mongoose = require('mongoose')
mongoose.set('useCreateIndex', true);
//etc
module.exports = mongoose

ثم اطلب الغلاف const mongoose = require('myMongoose') بدلاً من النمس في كل مكان. من المحتمل أن يكون هذا شيئًا مثل ما سأضطر إلى فعله في النهاية عندما أبدأ في الترقية إلى ما بعد 5.2.8.

لا يزال يتعين علي تعديل كافة الملفات الحالية. لكل ملف في المجلد models ، استبدل require ('mongoose') بـ require('myMongoose') . ينطبق الأمر نفسه على app.js و bin/www .

السؤال هو: في إصدار مستقبلي من mongoose لن أحتاج إلى تضمين mongoose.set ('useCreateIndex', true) أو هل سيكون هذا طبيعيًا ، لمشكلات التوافق مع الإصدارات الأقدم من mongo ، node ، إلخ ...؟

أظن أن السلوك سيبقى كما هو الآن ( الحاجة إلى ضبط المتغير ، وليس التنفيذ الداخلي له ) حتى الإصدار الرئيسي التالي (أي 6.0.0 ) من النمس.

لقد أضفت الآن mongoose.set('useCreateIndex', true) إلى جميع الملفات التي تحتوي على require('mongoose') . أفكر في استخدام غلاف ('./myMongoose') أو ('./mongoose-custom') . ما رأيك؟

هل يجب أن يكون هذا عالميًا؟ هل هي قضية صريحة؟

من غير المريح حقًا إضافة mongoose.set('useCreateIndex', true) في كل ملف يحتوي على بيانات نموذجية.
لماذا لا تجعله يعمل من خيارات connect أيضًا ، أو قم بتعيينه قبل الاتصال؟

تضمين التغريدة إعادة فتح هذا للبحث في الحلول المحتملة.

لست بحاجة إلى وضع هذا في كل ملف ، ولكن لسوء الحظ يبدو أنك تحتاج الآن إلى وضع mongoose.set ('useCreateIndex' ، true) قبل أي مكالمات mongoose.model (). يعد هذا أمرًا صعبًا إذا قمت بتصدير النماذج بدلاً من المخططات. سيضيف إصلاح لهذا.

بعد الترقية إلى الإصدار 5.2.13 ، هل يجب أن يوقف هذا التحذيرات؟ شكرا

javascript mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })

bash the options [useCreateIndex] is not supported server: listening on port 3000 +0ms mongo: Connected +34ms (node:18457) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

samuelcecilio useCreateIndex ليس خيار اتصال ، ولكن طالما أنك تتصل بـ mongoose.set('useCreateIndex', true); قبل استدعاء mongoose.model() (حتى في الملفات الأخرى) ، يجب أن تكون جميع المكالمات اللاحقة إلى mongoose.model احتياطية إلى الخيار الذي حددته بـ mongoose.set() . لقد اختبرت 5.2.13 مع المثال أعلاه ، وبدلاً من ذلك اتصلت mongoose.set('useCreateIndex', true) في ملف bin / www وليس في طريقي. انه يعمل الان.

يعمل مع 5.2.13 بعد الاتصال وقبل جميع الملفات الأخرى.

هذا اتصال في ملف db.js الخاص بي:

// Create the database connection
mongoose.connect(encodeMongoURI(dbURI), options);
mongoose.set('useCreateIndex', true);

لدي اتصال mongo الخاص بي في نص منفصل. بهذه الطريقة أسمي mongoose.set ('useCreateIndex' ، صحيح) ؛ مباشرة قبل الاتصال فعليًا بـ mongo. ثم ليست هناك حاجة لوضعها في أي من إعلانات النموذج الخاصة بي.

اقتراحLucHighwalker هو الطريقة الصحيحة للقيام بذلك. من الناحية المثالية ، تضع كل هذه الخيارات العامة مباشرة قبل مكالمتك على mongoose.connect() .

هل هناك فرق وظيفي بين

mongoose.connect(encodeMongoURI(dbURI), options);
mongoose.set('useCreateIndex', true);

و

mongoose.set('useCreateIndex', true);
mongoose.connect(encodeMongoURI(dbURI), options);

؟ لأن كلاهما يبدو أنه يعمل بشكل جيد في 5.2.17

mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })

يعمل مع أحدث إصدار

حسنًا ، أعتقد أن @ types / mongoose هي بعض الإصدارات التي كانت وراء ذلك الوقت (لا تعمل على الكتابة المطبوعة حتى الآن).

mongoose.connect(url, { useNewUrlParser: true, autoIndex: false })

إجابةDionesio هي الحيلة بالنسبة لي. شكرا!

mongoose.connect ("mongodb: // localhost: 27017 / test"، {useNewUrlParser: true})؛
mongoose.set ('useCreateIndex' ، صحيح) ؛

أدى هذا إلى حل جميع تحذيرات الإيقاف الخاصة بي.

samuelcecilio بعد التلاعب بهذا ، وجدت أنني بحاجة إلى ضبط useCreateIndex على true في ملف المسار الذي يحتوي على النموذج. في حالتي ، بعد استخدام أداة cli السريعة ، كنت بحاجة إلى تعيين useCreateIndex في مسار الفهرس الموضح أدناه:

var express = require('express');
var router = express.Router();
const mongoose = require('mongoose');
mongoose.set('useCreateIndex', true);
const Test = mongoose.model('test', { name: {type: String, unique: true }});

/* GET home page. */
router.get('/', function(req, res, next) {
  Test.create({ name: 'billy' }).then((doc) => {
    return res.status(200).json({ done: true, test: doc.id });
  }).catch((e) => {
    return res.status(500).json({ err: e });
  });
});

module.exports = router;

بدون الخيار المحدد في مسار الفهرس الذي حصلت عليه:

[nodemon] starting `node bin/www`
version: 5.2.10
(node:17042) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

بعد تحديد الخيار في المسار الذي حصلت عليه:

[nodemon] starting `node bin/www`
version: 5.2.10
^C

حاولت وضعه في bin / www لكن ذلك لم يخلصك من التحذير. كان فقط تعيينه في المسار ناجحًا.

إخراج الشباك المضيف المحلي

~>: curl localhost:3000/
{"done":true,"test":"5b84a4e13ec72e4352475426"}~>: 
~>: 

شكرًا - إضافة mongoose.set ('useCreateIndex' ، صحيح) ؛ أصلحت مشكلتي

سأقوم بقفل هذه القضية. للرجوع إليها في المستقبل ، راجع دليل الإهمالات في مستنداتنا

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