Mongoose: لم يتم تشغيل schema.pre ("حفظ") بواسطة MyModel.update ()

تم إنشاؤها على ١٦ يوليو ٢٠١١  ·  11تعليقات  ·  مصدر: Automattic/mongoose

example.js:

var mongoose = require('mongoose')
  , Schema = mongoose.Schema

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

var Thing = new Schema({
  title : String,
  content : String
})

Thing.pre('save', function(next){
  console.log("saving: %s (%s)", this.title, this.content)
  next()
})

var MyThing = mongoose.model('Thing', Thing)

var example = new MyThing({
  title : 'foo',
  content : 'bar'
})

example.save(function(err){
  MyThing.update({title:'foo'},{content:'baz'}, function(err, rs){
    console.log(rs)
  })  
})

انتاج:

$ node example.js 
saving: foo (bar)
1

يتم تشغيل ما قبل بواسطة الحفظ الأولي ، ولكن ليس التحديث.

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

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

يتيح لك Model.update إرسال عمليات $ set الذرية مباشرةً إلى mongodb.

ال 11 كومينتر

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

يتيح لك Model.update إرسال عمليات $ set الذرية مباشرةً إلى mongodb.

هذه ميزة أود الحصول عليها ؛ مفيد بشكل خاص عند الضغط على البيانات المتفرقة.

aheckman أتفق مع martindale ، أشعر أنه في واجهة المستخدم حيث لدينا تحديثات نموذج $.ajax مثل تمرير req.body._id إلى مسار النشر ، بعض أنواع الطرق المسبقة سيكون مفيدًا. مثال على حالة الاستخدام هو عندما ترسل رقمين ، وتريد أن يكون للنموذج pre('save') لحساب الإجمالي.

ربما pre('update') ofc

لقد لاحظت هذا أيضًا لذا أفترض أن هذا لا يعتبر تحسينًا يستحق الإضافة.

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

يعد تحديد تاريخ في حالتي أمرًا حساسًا للغاية في اللحظة التي يتم فيها حفظ تعهدات mongodb نظرًا لأن لدي عملية خلفية تقوم بتحميل مستندات محدثة بناءً على نافذة التاريخ والوقت المتحركة. أنا لا أقول أنه سيكون هناك الكثير من الانجراف الزمني ، لكن نهج aheckmann مقابل pre('update') المحتمل أن يحتوي على مزيد من الانجراف بحلول الوقت الذي يحدث فيه التوفير.

أود أن أرى بعض خيارات البرامج الوسيطة هنا.

إذن ما هو الحل؟ كنت أتوقع أن ما قبل ("حفظ") من شأنه أن يكتشف التحديثات ، والتي تبدو من الناحية اللغوية وكأنها تحفظ لي. نظرًا لأن التحديثات شائعة جدًا ، فإنها تجعل خطاف الحفظ أقل قيمة بكثير.

لست متأكدًا مما إذا كان أي شخص لا يزال يشاهد هذا أم لا ، ولكن بالنظر في وثائق النمس -
النمس
ضمن _Notes on findAndUpdate () _ المقطع يشير إلى المشكلات / 964 التي تشرح سبب عدم عمل ذلك. امل ان يساعد! :)

هذا هراء سخيف. لا يمكننا أن نفعل أي شيء غير متزامن في واضعي. أغبياء.

هذا خيط قديم حقًا ولكن لا بأس به. هناك ما قبل هذا أو تم اكتشافه منذ النشر.

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

وضع علامة # 964 والارتباك للفائدة.

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