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

नेवला:पता लगाएँ कि डाला गया दस्तावेज़ डुप्लिकेट है और यदि ऐसा है, तो मौजूदा दस्तावेज़ लौटाएँ

जबकि आपका कोड कुछ त्रुटि मामलों को संभालता नहीं है, और गलत find . का उपयोग करता है फ़ंक्शन, सामान्य प्रवाह विशिष्ट है जो वह कार्य देता है जो आप करना चाहते हैं।

  1. यदि डुप्लिकेट के अलावा अन्य त्रुटियां हैं, तो कॉलबैक को कॉल नहीं किया जाता है, जिसके कारण आपके NodeJs एप्लिकेशन में डाउनस्ट्रीम समस्याएं हो सकती हैं
  2. उपयोग findOne के बजाय find चूंकि कुंजी अद्वितीय है, इसलिए केवल एक ही परिणाम होगा। अन्यथा, यह एक सरणी लौटाएगा।
  3. यदि आपके कॉलबैक में पारंपरिक error की अपेक्षा की जाती है पहले तर्क के रूप में, आप सीधे कॉलबैक को findOne . पर पास कर सकते हैं एक अनाम फ़ंक्शन शुरू करने के बजाय फ़ंक्शन।
  4. आप findOneAndUpdate भी देखना चाहेंगे अंततः, इस पर निर्भर करता है कि आपका अंतिम स्कीमा और तर्क क्या होगा।

जैसा कि उल्लेख किया गया है, आप findOneAndUpdate . का उपयोग करने में सक्षम हो सकते हैं , लेकिन अतिरिक्त लागत के साथ।

function save(id, title, callback) {
    Value.findOneAndUpdate(
       {id: id, title: title}, /* query */
       {id: id, title: title}, /* update */
       { upsert: true}, /* create if it doesn't exist */
       callback);
}

निश्चित रूप से अभी भी कॉलबैक है, लेकिन डुप्लिकेट मिलने पर यह डेटा को फिर से लिखेगा। क्या यह समस्या वास्तव में उपयोग के मामलों पर निर्भर करती है।

मैंने आपके कोड की थोड़ी सफाई की है... लेकिन यह वास्तव में काफी सरल है और कॉलबैक स्पष्ट होना चाहिए। callback फ़ंक्शन को हमेशा या तो नया सहेजा गया दस्तावेज़ प्राप्त होता है या जिसे डुप्लिकेट के रूप में मिलान किया गया था। यह saveNewValue . को कॉल करने वाले फंक्शन की जिम्मेदारी है त्रुटि की जांच करने और इसे ठीक से संभालने के लिए। आप देखेंगे कि कैसे मैंने यह भी सुनिश्चित किया है कि कॉलबैक को त्रुटि के प्रकार की परवाह किए बिना कॉल किया जाता है और हमेशा परिणाम के साथ एक सुसंगत तरीके से कॉल किया जाता है।

function saveNewValue(id, title, callback) {
    if (!callback) { throw new Error("callback required"); }
    var thisValue = new models.Value({
        id:id,
        title:title //this is a unique value
    });

    thisValue.save(function(err, product) {
        if (err) {
            if (err.code === 11000) { //error for dupes
                return models.Value.findOne({title:title}, callback);
            }            
        }    
        callback(err, product);
    });
}

वैकल्पिक रूप से, आप वादा का उपयोग कर सकते हैं नमूना। यह उदाहरण when.js का उपयोग कर रहा है ।

var when = require('when');

function saveNewValue(id, title) {
    var deferred = when.defer();

    var thisValue = new models.Value({
        id:id,
        title:title //this is a unique value
    });

    thisValue.save(function(err, product) {
        if (err) {
            if (err.code === 11000) { //error for dupes
                return models.Value.findOne({title:title}, function(err, val) {
                    if (err) {
                        return deferred.reject(err);
                    }
                    return deferred.resolve(val);
                });
            }
            return deferred.reject(err);
        }
        return deferred.resolve(product);
    });

    return deferred.promise;
}

saveNewValue('123', 'my title').then(function(doc) {
    // success
}, function(err) {
    // failure
});


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मोंगोस में सशर्त क्वेरी कैसे बनाएं?

  2. नया सी ++ मोंगो ड्राइवर:प्रकार कैसे देखें और स्ट्रिंग मान कैसे प्राप्त करें

  3. कुल फ़ंक्शन में स्किप काउंट 0

  4. MongoDB जावा ड्राइवर:MongoCore ड्राइवर बनाम MongoDB ड्राइवर बनाम MongoDB Async ड्राइवर

  5. mongodb $ मौजूद है जो हमेशा 0 लौटाता है