यदि आप अपेक्षित व्यवहार के "प्रमाण" की तलाश में हैं, तो स्रोत कोड से आगे नहीं देखें। विशेष रूप से schema.js के भीतर कोड> मुख्य परिभाषा :
updates.$setOnInsert = {};
updates.$setOnInsert[createdAt] = now;
}
return updates;
};
this.methods.initializeTimestamps = function() {
if (createdAt && !this.get(createdAt)) {
this.set(createdAt, new Date());
}
if (updatedAt && !this.get(updatedAt)) {
this.set(updatedAt, new Date());
}
return this;
};
this.pre('findOneAndUpdate', _setTimestampsOnUpdate);
this.pre('update', _setTimestampsOnUpdate);
this.pre('updateOne', _setTimestampsOnUpdate);
this.pre('updateMany', _setTimestampsOnUpdate);
}
function _setTimestampsOnUpdate(next) {
var overwrite = this.options.overwrite;
this.update({}, genUpdates(this.getUpdate(), overwrite), {
overwrite: overwrite
});
applyTimestampsToChildren(this);
next();
}
तो वहां आप सभी 'pre'
. देख सकते हैं मिडलवेयर हैंडलर प्रत्येक "अपडेट" विधि प्रकार के लिए और समान कार्यात्मक कोड के लिए पंजीकृत किए जा रहे हैं। ये सभी अनिवार्य रूप से $set
को संशोधित करते हैं
किसी भी "अपडेट" में ऑपरेटर जिसे आप updatedAt
. शामिल करने के लिए जारी करते हैं फ़ील्ड, या जो भी नाम आपने स्कीमा विकल्पों में उस कुंजी से मैप किया है।
"अपसर्ट" क्रियाओं के साथ भेजा गया वास्तविक विवरण $setOnInsert<का उपयोग करता है /कोड>
createdAt
. के लिए फ़ील्ड या मैप किए गए विकल्प का नाम (सूची में सबसे ऊपर देखें)। यह क्रिया केवल तब लागू होता है जब कोई "अप्सर्ट" वास्तव में होता है, इसलिए जो दस्तावेज़ मौजूद हैं और जो "अपडेट" विधियों में से किसी के लिए केवल मेल खाते हैं, वे कभी नहीं हैं वास्तव में इस मूल्य से छुआ है।
वे ऑपरेटर इस बात का हिस्सा हैं कि MongoDB कैसे काम करता है और वास्तव में नेवला के साथ नहीं करता है, लेकिन यहां दिखाया गया कोड दिखाता है कि इन अतिरिक्त कार्यों को शामिल करने के लिए नेवला आपके "अपडेट" कार्यों को कैसे "समायोजित" करता है।
संदर्भ के लिए schema.js
. में संपूर्ण मुख्य कार्य जो यह निर्धारित करता है कि वर्तमान में क्या लागू किया जाए लाइन #798ए> genUpdates()
. के लिए यहां दिखाए गए सूची के निचले हिस्से में फ़ंक्शन के रूप में बुलाया गया है, फिर भी शीर्ष भाग उस फ़ंक्शन की आखिरी कुछ पंक्तियां है जहां $सेटऑनइन्सर्ट
परिभाषित हो जाओ।
तो संक्षेप में, हाँ हर "अपडेट" कार्रवाई जानबूझकर है कि updatedAt
मैप की गई फ़ील्ड में वर्तमान दिनांक
है मान असाइन किया गया है, और यह भी कि "अपडेट" को संशोधित करके $setOnInsert
कार्रवाई जो केवल तब लागू होता है जब createdAt
के लिए "अप्सर्ट" क्रिया के परिणामस्वरूप एक नया दस्तावेज़ बनाया जाता है मैप किया गया फ़ील्ड.