2012-07-11 8 views
15

मैं pre('save') मिडलवेयर के भीतर उस संपत्ति के पिछले मूल्य (वर्तमान में डीबी में सहेजा गया है) के साथ किसी संपत्ति के नए/आने वाले मूल्य की तुलना करना चाहता हूं।क्या मोंगोस पूर्व ('सेव') में संपत्ति के पिछले मूल्य तक पहुंच प्रदान करता है?

क्या मोंगोस ऐसा करने की सुविधा प्रदान करता है?

उत्तर

18

मोंगोस आपको कस्टम सेटर्स को कॉन्फ़िगर करने की अनुमति देता है जिसमें आप तुलना करते हैं। प्री ('सेव') स्वयं आपको जो चाहिए वह आपको नहीं देगा, लेकिन एक साथ:

schema.path('name').set(function (newVal) { 
    var originalVal = this.name; 
    if (someThing) { 
    this._customState = true; 
    } 
}); 
schema.pre('save', function (next) { 
    if (this._customState) { 
    ... 
    } 
    next(); 
}) 
+0

बस मुझे जो चाहिए था। धन्यवाद। – smabbott

+1

क्या मुझे ** वैधकर्ता ** में पिछले मान तक पहुंचने के लिए ऐसा करने की ज़रूरत है? या वैधता के मामले में और अधिक सरल तरीका है? – eagor

+0

@Aaronheckmann पुराने धागे को पुनर्जीवित करने के लिए खेद है, मुझे लगता है कि यह काम नहीं करेगा, अगर हमारे पास लोड बैलेंसर के पीछे एकाधिक नोड सर्वर है। – Saurabh

12

स्वीकृत उत्तर बहुत अच्छी तरह से काम करता है। एक वैकल्पिक वाक्य रचना भी स्कीमा परिभाषा के साथ सेटर इनलाइन साथ इस्तेमाल किया जा सकता है:

var Person = new mongoose.Schema({ 
    name: { 
    type: String, 
    set: function(name) { 
     this._previousName = this.name; 
     return name; 
    } 
}); 

Person.pre('save', function (next) { 
    var previousName = this._previousName; 
    if(someCondition) { 
    ... 
    } 
    next(); 
}); 
+0

क्या होगा यदि कोई त्रुटि सहेज रही है? – R01010010

1

ईमानदारी से, मैं करने की कोशिश की समाधान यहां पोस्ट, लेकिन मैं एक समारोह है कि एक सरणी में पुराने मान संग्रहीत हैं बनाने के लिए किया था, मूल्यों को बचाओ, और फिर अंतर देखें।

// Stores all of the old values of the instance into oldValues 
const oldValues = {}; 
for (let key of Object.keys(input)) { 
    if (self[key] != undefined) { 
     oldValues[key] = self[key].toString(); 
    } 

    // Saves the input values to the instance 
    self[key] = input[key]; 
} 

yield self.save(); 


for (let key of Object.keys(newValues)) { 
    if (oldValues[key] != newValues[key]) { 
     // Do what you need to do 
    } 
}