Mongoose: فشل حفظ نموذج مع وجود خطأ mongo: MongoError: معدل غير معروف: pushAll $

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

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

الإبلاغ عن خطأ

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

اختبار اجتياز الجهاز المحلي ولكن الفشل على خادم jenkins بنفس الإصدارات بالضبط. الاختلاف الوحيد المحلي هو أن macos و jenkins هو ubuntu بقدر ما أستطيع أن أقول.

في MacOS Sierra ، العقدة 8.4 و 7.11 و mongodb 3.4.7 و mongoose 4.11.7 ، يمر الاختبار التالي ، ولكن على خادم jenkins الخاص بنا مع نفس الإصدارات على خادم ubuntu 16.04 يفشل.

  it("should successfully allow an alias that matches a service", async () => {
    const aliasTag = "this is a test";
    const appAlias = await AliasController.create(user, appAliasSpec);
    const serviceAlias = await AliasController.create(user, serviceAliasSpec);

    appAlias.aliases.push(aliasTag);
    await appAlias.save(); // This is the line that fails in jenkins

    serviceAlias.aliases.push(aliasTag);
    await serviceAlias.save();

    const confAppAlias = await AliasController.getById(appAlias._id);
    const confServiceAlias = await AliasController.getById(serviceAlias._id);
    expect(confAppAlias.aliases[1]).to.equal(aliasTag);
    expect(confServiceAlias.aliases[1]).to.equal(aliasTag);
  });

هذا هو الخطأ الدقيق الذي أحصل عليه:

{
    "message": "Unknown modifier: $pushAll",
    "name": "MongoError",
    "stack": "MongoError: Unknown modifier: $pushAll\n    at Function.MongoError.create (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/error.js:31:11)\n    at toError (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/utils.js:139:22)\n    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/collection.js:1060:67\n    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/connection/pool.js:469:18\n    at _combinedTickCallback (internal/process/next_tick.js:131:7)\n    at process._tickCallback (internal/process/next_tick.js:180:9)",
    "code": 9
}

تحرير: هنا نسخة أكثر قابلية للقراءة من تتبع المكدس

MongoError: Unknown modifier: $pushAll
    at Function.MongoError.create (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/error.js:31:11)
    at toError (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/utils.js:139:22)
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/collection.js:1060:67
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/connection/pool.js:469:18
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)
needs clarification

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

حسنًا ، هذه مشكلة واحدة ، mongodb 3.5 هو إصدار مطور غير مستقر ويجب عدم استخدامه. تم إهمال $ pushAll لفترة طويلة ، لذا ربما تخلصوا منه في 3.5. mbroadst هل يمكنك التوضيح؟

أضفنا خيارًا usePushEach للتغلب على هذا الأمر منذ فترة: https://github.com/Automattic/mongoose/issues/4455 ، يجب أن يكون هذا حلاً لهذه المشكلة:

new Schema({ arr: [String] }, { usePushEach: true });

ال 27 كومينتر

هل يمكنك عمل mongoose.set('debug', true) ولصق ناتج المونجو؟

تحرير: إخراج أكثر وضوحا

Mongoose: aliases.update({ _id: ObjectId("599d98122b72d12e0ba858b4") }, { '$pushAll': { aliases: [ 'this is a test' ] }, '$set': { updatedAt: new Date("Wed, 23 Aug 2017 14:58:26 GMT") }, '$inc': { __v: 1 } })
{"name":"davis","hostname":"ld-ub-bm980a98v","pid":11787,"level":50,"err":{"message":"Unknown modifier: $pushAll","name":"MongoError","stack":"MongoError: Unknown modifier: $pushAll
    at Function.MongoError.create (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/error.js:31:11)
    at toError (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/utils.js:139:22)
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/collection.js:1060:67
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/connection/pool.js:469:18
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)","code":9},"msg":"An unhandled Mongo error occurred.","time":"2017-08-23T14:58:26.201Z","v":0}

لمعرفة ما يستحق ، راجعت إخراج التصحيح في بيئات التطوير والإنتاج المحلية لدينا وكلاهما يستخدم معدِّل pushAll $ بنجاح. يتم تثبيت Mongo من الحزم الرسمية في جميع الأحوال. آلات التطوير هي windows و MacOS ، وآلات الإنتاج هي amazon linux.

هل يمكنك الاتصال بمثيل jenkins mongodb الخاص بك باستخدام mongo shell والتحقق مرة أخرى من الإصدار باستخدام db.version ؟

$ mongo test
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017/test
MongoDB server version: 3.4.1 
> db.version()
3.4.1
> ^C
bye

يمكنك أيضًا طباعة إصدار الخادم باستخدام الأمر serverStatus() باستخدام mongoose:

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/test');

mongoose.connection.on('open', function() {
  mongoose.connection.db.admin().serverStatus(function(error, info) {
    console.log(info.version);
  });
});

يرجى التحقق مرة أخرى من الإصدار الخاص بك أولاً ، تميل الحزم الرسمية إلى التقادم بسرعة كبيرة.

نعم ، لديك نفس الخطأ. حاول الانتقال من 3.2 إلى 3.5 (بدون ترحيل البيانات). لدي مجال مصفوفة

    'liked': {
        'item':[ {
            'id': {'type': Types.ObjectId, 'ref': 'Item'},
            'score': {'type': Number, 'max': 100, 'default': -1},
            'comment': {'type': String, 'maxlength': 65000, 'trim': true, 'default': '', 'set': san.methods.safe}
        } ]
    },

أعلم أن id ليس أفضل اسم حقل ، لكنه نجح في 3.2. في 3.5 يفشل بعد محاولة .save() المستند بعد دفع عنصر إلى المصفوفة. أدفع العناصر عبر .push() ثم أضع علامة على الحقل .markModified('liked.item'); . schould يكون بسيطا.

MongoDB 3.5؟

نعم

 targetMinOS: Windows 7/Windows Server 2008 R2
 db version v3.5.13
 git version: 52bbaa007cd84631d6da811d9a05b59f2dfad4f3
 OpenSSL version: OpenSSL 1.0.1u-fips  22 Sep 2016
 allocator: tcmalloc
 modules: none
 build environment:
     distmod: 2008plus-ssl
     distarch: x86_64
     target_arch: x86_64

حسنًا ، هذه مشكلة واحدة ، mongodb 3.5 هو إصدار مطور غير مستقر ويجب عدم استخدامه. تم إهمال $ pushAll لفترة طويلة ، لذا ربما تخلصوا منه في 3.5. mbroadst هل يمكنك التوضيح؟

أضفنا خيارًا usePushEach للتغلب على هذا الأمر منذ فترة: https://github.com/Automattic/mongoose/issues/4455 ، يجب أن يكون هذا حلاً لهذه المشكلة:

new Schema({ arr: [String] }, { usePushEach: true });

@ vkarpov15 نعم تمت إزالته مقابل featureCompatibilityVersion=3.6

تاتش. في هذه الحالة سوف نتأكد من إخراج # 5670.

أواجه نفس المشكلة بالضبط أنا أستخدم mongodb v3.6 على ubuntu الخاص بي. إذا تمت إزالة pushAll من db ، فكيف يمكنني حفظ المثيل .. من فضلك زودني بأي بديل

rankitbishnoi يمكنك usePushEach على كل تعريف مخطط في الخيارات.

@ vkarpov15 شكرا على المكتبة الرائعة يا سيدي.

أنا أيضًا أواجه هذه المشكلة مع Mongoose 4.13.7 و MongoDB 3.6.0.

تحديث: أدت إضافة usePushEach: true إلى خيارات مخطط النماذج إلى حل هذا الأمر.

chaddjohnsondyladan يعمل حقا.
شكر كثيرا!

من فضلك كيف يمكنني فعل هذا؟ كيف يمكنني إضافة هذا إلى خيارات المخطط؟ اشكرك!

@ raphaelbp12 فيما يلي المستندات الخاصة باستخدام خيارات المخطط: http://mongoosejs.com/docs/guide.html

لا يؤدي تحديث المخطط إلى تغيير هذا السلوك. إنه لا يعمل مع البيانات القديمة في قاعدة البيانات بالفعل لـ 3.6.

تحرير: العودة إلى الإصدار 3.4 حل المشكلة.

كنت أواجه مشكلة مماثلة في تشغيل الكود في جهازي. أعتقد أنه بسبب Mongoose 5 و MongoDB 3.6. حاول التراجع:

  • Mongoose إلى الإصدار 4.13.8 ( npm install [email protected] --save ) ، و
  • MongoDB إلى 3.4 (يمكنك التحقق من الإصدار بكتابة db.version() ).

عملت معي! :)

لا ينبغي أن تتأثر Mongoose 5 بهذه المشكلة ، فهي لا تستخدم $pushAll أي مكان. إذا تلقيت هذا الخطأ مع mongoose 5 ، فالرجاء فتح مشكلة في نماذج التعليمات البرمجية: +1:

ملاحظة C: \ Users \ paula \ projetos \ apiNode \ src> node index.js
{MongoError: معدِّل غير معروف: pushAll $
في Function.MongoError.create (C: \ Users \ paula \ projetos \ apiNode \ node_modules \ mongodb-core \ lib \ error.js: 31: 11)
في toError (C: \ Users \ paula \ projetos \ apiNode \ node_modules \ mongodb \ lib \ utils.js: 139: 22)
في C: \ Users \ paula \ projetos \ apiNode \ node_modules \ mongodb \ lib \ collection.js: 1059: 67
في C: \ Users \ paula \ projetos \ apiNode \ node_modules \ mongodb-core \ lib \ connection \ pool.js: 469: 18
في _combinedTickCallback (داخلي / عملية / next_tick.js: 131: 7)
في process._tickCallback (داخلي / عملية / next_tick.js: 180: 9)
الاسم: "MongoError" ،
message: "معدل غير معروف: pushAll $" ،
سائق: صحيح ،
الفهرس: 0 ،
الكود: 9

مرحبًا بالجميع ، من فضلك أخبرني كيف أصلح الخطأ Unknown modifier: $ pushAll

робовал вот так не работает
const mongoose = تتطلب ('mongoose')
const Схема = mongoose.Schema

const UserSchema = مخطط جديد ({
معرف برقية: {
نوع الرقم،
مطلوب: صحيح ،
usePushEach: صحيح
} ،

أفلام: {
اكتب: [سلسلة] ،
إفتراضي: []
}
})

mongoose.model ("المستخدمون" ، UserSchema)

@ rivers-lis يجب عليك إضافة usePushEach إلى خيارات المخطط ، وليس إلى المخطط ، مثل:

new Schema({ ... }, { usePushEach: true });

ак то вот так
const mongoose = تتطلب ('mongoose')
مخطط كونست = النمس

const UserSchema = مخطط جديد ({
معرف برقية: {
نوع الرقم،
مطلوب: صحيح
} ،

films: {
    type: [String],
    default: []
}

})

مخطط جديد ({}، {usePushEach: true})

mongoose.model ("المستخدمون" ، UserSchema)

new Schema({ ... }, { usePushEach: true });
هذا يحل الخطأ بالنسبة لي أيضًا في الإصدار 4.4.12 و 5.0.7

ак то вот так
const mongoose = تتطلب ('mongoose')
مخطط كونست = النمس

const UserSchema = مخطط جديد ({
معرف برقية: {
نوع الرقم،
مطلوب: صحيح
} ،

films: {
    type: [String],
    default: []
}

})

مخطط جديد ({}، {usePushEach: true})

mongoose.model ("المستخدمون" ، UserSchema)

آسف لا أستطيع قراءة الروسية

DanGDroid ترجم تقريبًا "Как то вот так" -> "شيء من هذا القبيل"

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