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

MongoDB नेवला उप-दस्तावेज़ दो बार बनाए गए

आपके प्रयास में forEach लूप findById() के कॉलबैक पूर्ण होने की पहचान नहीं करता है अगले पुनरावृत्ति से पहले async विधि। आपको किसी भी async का उपयोग करने की आवश्यकता है पुस्तकालय के तरीके async.each , async.whilst , या async.until जो एक लूप के बराबर हैं, और अगले पुनरावृत्ति पर जाने से पहले एसिंक्स के कॉलबैक को लागू करने तक प्रतीक्षा करेंगे (दूसरे शब्दों में, एक लूप के लिए जो उपज देगा)।

उदाहरण के लिए:

var platform_docs = [];
async.each(platforms, function(id, callback) {
    Platform.findById(id, function(err, platform) {
        if (platform) 
            platform_docs.push(platform);
        callback(err);
    });
}, function(err) {
   // code to run on completion or err
   console.log(platform_docs);
});

पूरे ऑपरेशन के लिए, आप async.waterfall() विधि जो प्रत्येक फ़ंक्शन को अपने परिणामों को अगले फ़ंक्शन पर पास करने की अनुमति देती है।

विधि में पहला कार्य नया लेख बनाता है।

दूसरा फ़ंक्शन async.each() . का उपयोग करता है प्लेटफ़ॉर्म सूची पर पुनरावृति करने के लिए उपयोगिता फ़ंक्शन, findByIdAndUpdate() , और जब वे सभी काम पूरा कर लें तो किसी ऑब्जेक्ट वेरिएबल में अद्यतन क्वेरी के परिणाम अगले फ़ंक्शन पर वापस कर दें।

अंतिम कार्य पिछले पाइपलाइन से प्लेटफ़ॉर्म आईडी के साथ नव निर्मित लेख को अपडेट करेगा।

निम्न उदाहरण जैसा कुछ:

var newArticle = {},
    platforms            = req.body.platforms,
    date                 = req.body.date,
    split                = date.split("/");

newArticle.title         = req.body.title;
newArticle.description   = req.body.description;
newArticle.date          = split[2]+'/'+split[0]+'/'+split[2];
newArticle.link          = req.body.link;
newArticle.body          = req.body.body;
console.log(platforms);

async.waterfall([

    // Create the article
    function(callback) {
        var article = new Article(newArticle);
        article.save(function(err, article){
            if (err) return callback(err);                  
            callback(null, article);
        });
    },

    // Query and update the platforms 
    function(articleData, callback) {
        var platform_ids = [];
        async.each(platforms, function(id, callback) {
            Platform.findByIdAndUpdate(id, 
                { "$push": { "articles": articleData._id } },
                { "new": true },
                function(err, platform) {
                    if (platform) 
                        platform_ids.push(platform._id);
                    callback(err);
                }
            );
        }, function(err) {
            // code to run on completion or err
            if (err) return callback(err);                  
            console.log(platform_ids);
            callback(null, {
                "article": articleData,
                "platform_ids": platform_ids
            });
        });         
    },

    // Update the article
    function(obj, callback) {
        var article = obj.article;
        obj.platform_ids.forEach(function(id){ article.platforms.push(id); });
        article.save(function(err, article){
            if (err) return callback(err);                  
            callback(null, article);
        });
    }   

], function(err, result) { 
/*
    This function gets called after the above tasks 
    have called their "task callbacks"
*/
    if (err) return next(err);
    console.log(result);
    res.redirect('articles/' + result._id);
});


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मोंगोडब एकत्रीकरण में मिलीसेकंड को आज तक कैसे परिवर्तित करें?

  2. एक प्रश्न में प्रत्येक संपत्ति के लिए अलग-अलग मूल्यों और गणनाओं को समूहित करें

  3. ग्रिडएफएस (मोंगोडीबी) के लिए कस्टम स्टोरेज सिस्टम?

  4. मोंगोडीबी गो के साथ एमजीओ, ऑपरेटरों के साथ bson.M / bson.D हमेशा सिंटैक्स त्रुटि मिली

  5. एम्बेडेड दस्तावेज़ की तुलना mongoDB के साथ मूल फ़ील्ड से करें