MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

क्या नेवला अपरर्ट ऑपरेशन अद्यतन/डिफ़ॉल्ट स्कीमा मानों को नवीनीकृत करता है?

यदि आप अपेक्षित व्यवहार के "प्रमाण" की तलाश में हैं, तो स्रोत कोड से आगे नहीं देखें। विशेष रूप से 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 के लिए "अप्सर्ट" क्रिया के परिणामस्वरूप एक नया दस्तावेज़ बनाया जाता है मैप किया गया फ़ील्ड.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. डॉक्टर सरणी में प्रत्येक तत्व को एक शर्त से मिलान करने के लिए mongodb क्वेरी

  2. जंग मोंगो ड्राइवर प्रोटोटाइप का उपयोग करते समय मैं chrono::DateTime फ़ील्ड को ISODate के रूप में क्रमबद्ध कैसे करूं?

  3. क्या मैं एक मोंगो एकत्रीकरण क्वेरी में शीर्ष स्तर के दस्तावेज़ के रूप में फ़ील्ड वापस करने के लिए $ प्रोजेक्ट का उपयोग कर सकता हूं?

  4. MongoDB लेनदेन का उपयोग करने के लिए आवश्यकताएँ

  5. पाठ खोज के साथ कोई परिणाम नहीं MongoDB PHP