Mongoose: طريقة تحديث النموذج لا تحترم المدققين

تم إنشاؤها على ٢٤ أبريل ٢٠١٢  ·  59تعليقات  ·  مصدر: Automattic/mongoose

يمكنني استخدام طريقة model.Update للتحديث إلى أي قيمة بغض النظر عن قيود المخطط

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

كان السلوك المتوقع هو إلقاء خطأ إذا لم يتم التحقق من صحة القيمة المحدثة.

أقترح خيارًا إضافيًا لطريقة التحديث للخروج عند الخطأ الأول أم لا.

new feature

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

+1

من غير المنطقي تمامًا ألا يستخدم التحديث: الإعدادات الافتراضية ، والمحددون ، والتحقق من الصحة والتعداد. ما فائدة المخطط إذا كانت العمليات الأساسية لا تلتزم به.

ال 59 كومينتر

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

مخطط جديد ({..} ، {صارم: صحيح})

يوجد طلب سحب مشابه في انتظار أن يتم دمجه يتم طرحه عند تعيين مسارات غير موجودة في المخطط ولكن لا يتم طرحه أثناء model.update . ربما يجب أن نضيف ذلك إلى PR أعلاه وتمرير الخطأ إلى رد الاتصال.

مرحبًا مرة أخرى ، شكرًا على ردك السريع.

لم أكن أشير إلى مسارات غير صالحة ولكن أقيد داخل مسار معين.

خذ هذا المثال

مستخدم var = مخطط جديد ({
اسم االمستخدم: {
اكتب: سلسلة ،
الأحرف الصغيرة: صحيح ،
تقليم: صحيح ،
فريد: صحيح
} ،
اسم: {
اكتب: سلسلة ،
تقليم: صحيح ،
مطلوب: صحيح ،
فريد: خطأ ،
الفهرس: صحيح
} ،
كلمه السر: {
اكتب: سلسلة ،
مطلوب: صحيح ،
حدد: خطأ ،
مجموعة: تشفير
} ،
وظيفة: {
اكتب: سلسلة ،
"المستخدم الافتراضي'،
"enum": ['user'، 'admin'، 'root']
} ،
خلقت: {
اكتب: التاريخ ،
"الافتراضي": Date.now
}
} ، {صارم: صحيح}) ؛

users.update ({"username": "test"}، {"role": "thisShowldFail"}، function (err، val) {
...
}) ؛

لاحظ أن المستخدم الآن "اختبار" له دور "thisShowldFail" حتى مع تمكين خيار المخطط الصارم.
ألا يجب تحديث تعدادات الاحترام والخيارات المماثلة الأخرى؟

أنت على صواب ، يجب أن تتحقق من صحة التعدادات. اعتقدت أن هناك تذكرة لهذا في مكان ما.

+1 ، لا يمكن استخدام #update بسبب هذه المشكلة.

هل من الممكن السماح لـ .update بعمل كل الأشياء التي سيفعلها مستند جديد + حفظ؟

  • الافتراضات
  • واضع
  • عمليات التحقق المخصصة
  • تعداد

إذا تم استخدام خيار upert أيضًا

  • مطلوب

ليس حاليا

يعني هل من الممكن / مخطط لتنفيذ ...؟ :)

قد يكون لطيفا. ذات الصلة # 472

+1

من غير المنطقي تمامًا ألا يستخدم التحديث: الإعدادات الافتراضية ، والمحددون ، والتحقق من الصحة والتعداد. ما فائدة المخطط إذا كانت العمليات الأساسية لا تلتزم به.

+1

أنا أحب النمس ولكن إذا لم يتم التحقق من صحة التحديثات ، فسيكون ذلك أقل فائدة بالنسبة لي. لدي مستندات كبيرة ولا أريد تنزيلها لمجرد التحقق من الصحة.

هذا أنا أقفز. أنا أقوم بالغطس قليلاً ، في محاولة لتنفيذ ذلك.
الهدف هو الحصول على:

  • الافتراضات
  • واضع
  • التحقق من صحة
  • تعداد
  • مطلوب

لست متأكدًا من أنني سأكون ناجحًا ، لكنني سأجربها. سأبدأ مع المدققين.

تمني لي حظا سعيدا!

مير.

+1

+1

كان من الممكن أن يكون رائعًا إذا دعم .update التحقق.

نتوء +1

نتوءات وعرة +1

الرجاء إضافة التحقق من صحة على التحديث!

+1

تعديل: -2 لأنني لا أعتقد أن النمس يجب أن يتولى مسؤولية التحقق .. إذا كنت تريد التحقق من الصحة ، فيجب أن تفكر في استخدام مكتبة متخصصة أخرى مثل تلك التي تستخدم السماح بالتحقق من صحة مخطط JSON

thalesfsp نعم. لقد تمت تجربتها في الماضي ولكن القواعد أصبحت متزعزعة للغاية لأنه لا يوجد مستند في الذاكرة ويتعطل في عدة ظروف مما يترك السلوك غير متسق ومربك.

جمال المصدر المفتوح: إذا كنت تريد ميزة يمكنك كتابتها وإرسال طلب سحب مع اجتياز الاختبارات والتوثيق الذي يثبت أنها تعمل بشكل صحيح.

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

+1 Bump ، ستكون هذه ميزة مفيدة جدًا - عند إجراء التحديثات ، أود أن أرى دقائق / قصوى وما إلى ذلك محترمة من المخطط - وإلا فأنا أقوم بالكثير من المنطق المعياري لشيء يمكن أن يفعله النمس

سيكون من الرائع رؤية هذا يحدث. في الوقت الحالي ، يتمثل الحل البديل في العثور على الكائن ، وتغيير الحقول ثم حفظه ، مما يؤدي إلى تشغيل البرنامج الوسيط للتحقق. حسب المستندات :

Tank.findById(id, function (err, tank) {
  tank.size = 'large';
  tank.save(function (err) {
   // Document updated, do something with it
  });
});

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

aheckmann ، هل يمكنك تزويدنا ببعض التفاصيل حول جهود التنفيذ السابقة (الفاشلة) حتى لا يرتكب أي شخص يحاول هذا التصحيح نفس الأخطاء مرة أخرى؟

أهتم بشكل أساسي بأدوات التحقق المخصصة وقواعد التعداد التي يتم تطبيقها على التحديث. أعتقد أنه كان من المفترض أن تكون قيود المخطط الأخرى قد تم تطبيقها بالفعل عند حفظ المستند. هل مثل هذا التبسيط للمشكلة وصولاً إلى عمليات التعداد والمدققين فقط منطقي وإزالة الحاجة إلى وجود أي مستند أثناء التحديث؟

BrianHoldsworth أعتقد أن هذا قد يكون تبسيطًا مفرطًا. ماذا يحدث إذا تم تحديث حقل به قيد تحقق required: true ليكون سلسلة فارغة؟ سنحتاج هذا لإطلاق خطأ التحقق من الصحة.

أنا مهتم أيضًا بهذا. ربما يمكن كتابة مكون إضافي لتجاوز طريقة .update () وتشغيل التحقق من الصحة؟ بهذه الطريقة ، يمكن تنفيذ حتى الحل الجزئي. من ناحية أخرى ، إذا كانت جوهرية ، فمن المتوقع أن تتعامل مع كل نوع من التحقق وأن تكون قوية بنسبة 100٪.

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

+1 نتوء هذا.

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

+1

أحتاج هذا +1

+1

+1

+1

+1

في 3.9.3 update() سيكون لديك خياران خاصان ، setDefaultsOnInsert و runValidators ، والذي سيحدد الإعدادات الافتراضية ويقوم بتشغيل المدققات على استعلامك. شاهد الاختبارات على سبيل المثال ، لا توجد مستندات حقيقية حتى الآن :(

شكرا جزيلا لك - هذا إصلاح رائع!

@ vkarpov15 لقد استخدمت الكود الخاص بك لتطبيق التحقق أيضًا من أجل findOneAndUpdate. انظر PR # 2393.

مرحبًا ، هل تعرف متى سيتم إصدار الإصدار المستقر 3.9 لاستخدام التحقق من الصحة في التحديث؟

شكرا

AlexandreAWE سؤال جيد. أقوم حاليًا بإنهاء الأمور على الإصدار 4.0 والنسخة التجريبية لاختبار الفرع 3.9.x ، ولكن في الوقت الحالي "سيتم تنفيذ الأمر عند الانتهاء". آمل أن أحصل على RC قبل عيد الميلاد.

@ vkarpov15 كيف يأتي الإصدار 3.9.x المستقر؟ سيكون من الرائع إجراء عمليات التحقق من صحة التحديث بدلاً من البحث عن المشروع الحالي وتوفيره في كل مرة.

andrewholsted ينتظر mongodb driver 2.0 و mongodb server 2.8 للاستقرار - نأمل أن يحدث هذا هذا الشهر ، لكن لا يمكن شحن 4.0 حقًا دون دعم أحدث إصدار من mongodb وأحدث برنامج تشغيل. انظر إلى مدونتي لمزيد من التفاصيل.

من المحتمل أن يكون هذا السؤال غبيًا ، ولكن لماذا لا يتم تحديث البيانات والتحقق من صحة ذلك مقابل المخطط قبل تمريره إلى mongodb؟

أيضا ، +1

تحديد وانتظر

لا أستطيع الانتظار حتى يستقر 3.9 :)

هل هذه الميزة موجودة حتى الآن؟ تنتظر بفارغ الصبر 3.9 .. ون ستكون متاحة؟

يمكنك npm install mongoose@unstable للحصول على الإصدار غير المستقر. الوقت المقدر للوصول لـ 4.0 هو 25 مارس - مكان جيد للتحقق من هذه هي صفحة المعالم

فقط واجهت هذه القضية الليلة الماضية. سعيد لأنني لست الوحيد! أنا متحمس لإصدار هذا التغيير ، شكرًا لكل ما تفعله!

+1

لا أعرف لماذا تم وضع علامة مغلق على هذه المشكلة. ما زلت أواجهها.

لست متأكدًا من أن هذا يعمل على التحقق من صحة التعداد لـ findOneAndUpdate () ، حتى مع تعيين runValidators على القيمة true.

@ m1cah ، يرجى تقديم مثال يوضح ما تحاول القيام به. لدينا اختبارات لهذا وقد اجتازوا ...

@ vkarpov15 أعتقد أن هذا مثال قصير يوضح ذلك: http://code.runnable.com/VYhGbVhereIYdbst/update-validation-enum-for-mongoose-and-databases

حسنًا ، هناك مشكلة واحدة وهي أن المثال أعلاه يستخدم نسخة من عصور ما قبل التاريخ من النمس:

root<strong i="6">@runnable</strong>:~# head node_modules/mongoose/package.json                                                                                                                 
{                                                                                                                                                                         
  "name": "mongoose",                                                                                                                                                     
  "description": "Elegant MongoDB object modeling for Node.js",                                                                                                           
  "version": "3.6.14",                                                                                                                                                    
  "author": {                                                                                                                                                             
    "name": "Guillermo Rauch",                                                                                                                                            
    "email": "[email protected]"                                                                                                                                   
  },                                                                                                                                                                      
  "keywords": [                                                                                                                                                           
    "mongodb",  

حاول الترقية إلى 4.x ويجب أن تعمل.

هل أنت متأكد من أنه يعمل مع أسلوب enum و findOneAndUpdate؟
على النمس 4.2.6 يبدو أنه فشل ، يمكنني تعيين قيمة سيئة.

المخطط:

var UserSchema = new Schema({
    first_name: {
        type: String,
        required: true,
    },
    last_name: {
        type: String,
        required: true,
    },
    email: {
        type: String,
        unique: true,
        required: true,
    },
    embededData: [{
        type: {
            type: String,
            enum: ['value1', 'value2', 'value3']
            required: true
        }
    }]
}, { strict: true });

طريقة FindOneAndUpdate:

UserModel.findOneAndUpdate(
    {_id: uid}, 
    {$push: {embededData: data}}, 
    { runValidators: true }, function(err) {
});

ثم يمكنني دفع embededData.type = 'Panda';

راجع مستندات مدقق التحديث و # 2933 - لا تعمل أدوات التحقق من التحديث على $push ، فقط على $set و $unset

+1

بقدر ما أستطيع أن أرى ، هذا لا يزال لا يعمل في الحالة التي تستخدم فيها مدققًا مخصصًا في حقل يمثل مصفوفة.

على سبيل المثال ، مقتطف الشفرة هذا:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/myTestDB');

var db = mongoose.connection;

db.on('error', function (err) {
console.log('connection error', err);
});
db.once('open', function () {
console.log('connected.');
});

var Schema = mongoose.Schema;
var userSchema = new Schema({
  _id : String,
  name : {
    type: [String],
    validate: {
        validator: function (str) {
            return str.length > 1
        }
    },
  }
});


var User = mongoose.model('User', userSchema);

User.findOneAndUpdate({"name": ["John", "Doe"]}, { 
  $setOnInsert: {
    name: ["John"],
  },
}, { runValidators: true, upsert: true, new: true }, function (err, data) {
  if (err) {
    return console.log(err);
  } else {
    // console.log(data.validateSync())
    return console.log('Updated', data);
  }
});

سيسمح لك بتحديث المستخدم بحيث يكون لديه حقل name ["John"] دون حدوث أي أخطاء ، على الرغم من أن المدقق المخصص الذي قمت بتضمينه يحظر صراحةً أي مصفوفة أسماء ذات طول أقل من أو يساوي 1. المدقق نفسه يعمل بشكل جيد ، كما يتضح من حقيقة أنك إذا قمت بإلغاء التعليق على السطر console.log(data.validateSync()) ، وبالتالي إجبار التحقق من الصحة ، فإنه في الواقع سيعيد رسالة الخطأ المناسبة. المشكلة هي أن هذا التحقق من الصحة لا يتم داخل المكالمة findOneAndUpdate() ، على الرغم من حقيقة أنني قمت بتضمين الخيار runValidators=true .

يبدو وكأنه خطأ ، هل يمكنك فتح قضية منفصلة لذلك؟

شكرا

هل هناك أي إصلاح متاح للمشكلة المذكورة أعلاه؟ هههههههههههههه

@ Saravanan90 من فضلك توقف عن التعليق على القضايا التي أغلقت منذ فترة طويلة دون أي معلومات مفيدة. افتح مشكلة منفصلة مع نماذج التعليمات البرمجية.

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