2015-02-23 9 views
10

पर कई डेटा हटा देता है मेरे पास कई मॉडलों से मैंगोडब से हटाना चाहते हैं, मुख्य विचार यह है कि मेरे पास एकाधिक स्कीमा में किसी दस्तावेज़ के लिए एक ही आईडी है और मैं इसे हटाना चाहता हूं प्रत्येक मॉडल से दस्तावेज़। मैं इसे इस तरह कर रहा हूँ:मोंगोस एक बार

_.each(wrongList, function(item) { 
     UPUSTP.find({id: item.id}).remove(function(err) { 
      if (err) 
       console.log("Error while deleting " + err.message); 
     }) 

     UPUANAM.find({id: item.id}).remove(function(err) { 
      if (err) 
       console.log("Error while deleting " + err.message); 
     }) 

     UPUEXE.find({id: item.id}).remove(function(err) { 
      if (err) 
       console.log("Error while deleting " + err.message); 
     }) 

     UPUEXO.find({id: item.id}).remove(function(err) { 
      if (err) 
       console.log("Error while deleting " + err.message); 
     }) 

     UPUPROC.find({id: item.id}).remove(function(err) { 
      if (err) 
       console.log("Error while deleting " + err.message); 
     }) 
    }) 

समस्या मैं wrongList और क्वेरी कार्यों में 14000+ आईडी है, लेकिन यह खत्म करने के लिए बहुत समय लेता है वह यह है कि ... मैं कैसे के समय को बढ़ा सकते हैं हटाना? क्या मैं बैच या उस तरह कुछ हटा सकता हूं?

उत्तर

15

यह मानते हुए कि आप lo-dash उपयोग कर रहे हैं, तो आप _.pluck समारोह के साथ item आईडी का एक संग्रह प्राप्त कर सकते हैं। आइए इसे idsArray पर कॉल करें। अब आप $in ऑपरेटर की, एक async.parallel कॉल में, सीधे remove का उपयोग कर अपने मॉडल से, की तरह इस्तेमाल कर सकते हैं:

async.parallel({ 
    function (callback) { 
    UPUSTP.remove({ id: { $in: idsArray } }, function (err) { 
     if (err) return callback("Error while deleting " + err.message); 
     callback(null, "Some useful message here..."); 
    }); 
    }, 
    . // do the same with the other collections 
    . 
    . 
    function (err, result) { 
    // check the error and do somethin useful with the results 
    } 

पहले, $in db संग्रह के लिए केवल एक कॉल कम हो जाएगा। फिर async.parallel कार्यों को समानांतर और आखिरी में चलाएगा, मॉडल से सीधे remove प्रत्येक संग्रह के लिए find ऑपरेशन को हटा देगा।